客户端套接字上的setSoTimeout不会影响套接字

时间:2009-08-20 13:16:08

标签: java sockets timeout

我有一个Java应用程序,它有三个打开的​​线程,每个都是一个套接字,并连接到不同端口上的服务器。 在建立与服务器的连接后,我在每个套接字上设置了so_timeout。 之后,线程阻塞等待read()。 20秒后只有一个线程超时(这是我设置的超时)。 其他两个忽略了超时。 TCP层有可能一次只处理一个超时吗? 还有其他解释吗?

2 个答案:

答案 0 :(得分:3)

documentation说:

  

必须在进入阻止操作之前启用该选项才能生效。

也许你应该在建立与服务器的连接之前设置,至少在调用套接字上的read()之前。
但没有代码就很难说......

答案 1 :(得分:3)

过去我在Windows中处理SO_TIMEOUT时遇到了一些问题。我相信设置它是“假设”设置可能依赖于操作系统并与注册表设置冲突的底层套接字实现。

我的建议是不要使用SO_TIMEOUT强制在超时时抛出异常。在读取()之前,请使用非阻塞I / O或检查是否有可用字节()。