2 qufudashaozi qufudashaozi 于 2017.01.16 14:54 提问

java socket read timeout

大神们有没有遇到过网络通信实机上成功了,但是socket的read就是失败的情况(timeout)啊。
wireshark抓包确认服务器端的数据已经回来了。

用winsocket写个测试程序也是ok的。

设置socket的Timeout时间为10s也不行

4个回答

zhangpan_soft
zhangpan_soft   2017.01.16 19:31

摘别人的:
3 socket读超时
如果输入缓冲队列RecvQ中没有数据,read操作会一直阻塞而挂起线程,直到有新的数据到来或者有异常产生。调用setSoTimeout(int timeout)可以设置超时时间,如果到了超时时间仍没有数据,read会抛出一个SocketTimeoutException,程序需要捕获这个异常,但是当前的socket连接仍然是有效的。

如果对方进程崩溃、对方机器突然重启、网络断开,本端的read会一直阻塞下去,这时设置超时时间是非常重要的,否则调用read的线程会一直挂起。

TCP模块把接收到的数据放入RecvQ中,直到应用层调用输入流的read方法来读取。如果RecvQ队列被填满了,这时TCP会根据滑动窗口机制通知对方不要继续发送数据,本端停止接收从对端发送来的数据,直到接收者应用程序调用输入流的read方法后腾出了空间。
原贴url:"ttp://blog.csdn.net/sureyonder/article/details/5633647"

zhangpan_soft
zhangpan_soft   2017.01.16 19:33

所以根据它说的,你的呢个错误不是错误,而是正常!汗!注意你的抓包频率,假如你10秒抓一次包,设置超时时间为15秒,就不会出现呢个异常了

zhangpan_soft
zhangpan_soft   2017.01.16 19:34

正常时间应该是你抓包频率的1.5倍吧,

qufudashaozi
qufudashaozi   2017.01.17 14:25

这个找到方法修改了,数据发送和数据接收放在两个线程中,就好用了。想来想去也没想出来原因。
毕竟有些命令发送和接收在一个线程中就行。

因为也看不到服务器端的代码。所以暂时先不管了。

Csdn user default icon
上传中...
上传图片
插入图片