我有一个很奇怪的问题快把我逼疯了。
我有一个Rubyhtml" target="_blank">服务器和一个Flash客户端(动作脚本3)。这是一个多人游戏。
问题是,一切都在完美地工作,然后,突然,一个随机的球员停止接收数据。当服务器因为不活动而关闭连接时,大约20-60秒后,客户端接收到所有缓冲的数据。
socket.addEventListener(Event.CONNECT, connectHandler);
function connectHandler(event)
{
sendData(sess);
}
function sendData(dat)
{
trace("SEND: " + dat);
addDebugData("SEND: " + dat)
if (socket.connected) {
socket.send(dat);
} else {
addDebugData("SOCKET NOT CONNECTED")
}
}
socket.addEventListener(DataEvent.DATA, dataHandler);
function dataHandler(e:DataEvent) {
var data:String = e.data;
workData(data);
}
sock.write(data + DATAEOF)
sock.flush()
newsock = serverSocket.accept
newsock.sync = true
newsock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
我不认为这是一个操作系统/网络问题,因为我已经从一个位于西班牙的VPS换到了位于爱尔兰的亚马逊EC2,问题仍然存在。
我觉得也不是客户端网络的问题,因为这样的情况每天都有几十次,平均在线的用户量大概是45-55个,一天大概有400个唯一的用户,所以这个比例是极高的。
编辑:我做了更多的研究。我已经把服务器改成了C++。
我要把这个加进去,作为一个答案,这样人们就会对此有一些了解。
我认为答案是内核是关闭连接的那个。以下是一些信息:http://scie.nti.st/2008/3/14/Amazon-S3-and-connection-reset-by-peer
基本上,按照我的理解,Linux内核2.6.17+增加了TCP窗口/缓冲区的最大大小,如果它不能处理足够大的TCP窗口,这就会导致其他设备出现故障。齿轮将重置连接,我们将其视为“对等点重置连接”消息。
我已经按照步骤进行了操作,现在看来只有当客户端失去与Internet的连接时,服务器才会关闭连接。
我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到
client.py代码
因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:
当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。
所有这些似乎都运行良好,但cliend在身份验证后发送的数据似乎没有收到,只有3个字节设置为0。 我希望套接字在程序的生存期内保持打开状态,因此我不能处理流,因为这样也会处理套接字。 这里是客户端和服务器端的完整代码,希望有人能看到我的错误,或者我错过了一个问题。
我在JAVA中通过TCP接收字节数据包时遇到了一些问题。我的TCPServer类发送207字节的数据包。当我发送一个数据包时,控制台中的程序显示“读取207字节的数据包”然后停下来。在下一个数据包继续执行时,显示“多重测量”和“读取1868767867字节数据包”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节。 这是我