2009-08-20 101 views
2

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

+0

请张贴您的代码,您可能有一个鬼鬼祟祟的逻辑错误,不能被您的问题抓住。 – Jonathan 2009-08-20 13:25:20

+0

拨打sock.getSoTimeout()以确保它返回20000.也发布一些代码。你在运行什么操作系统? – Nick 2009-08-20 20:36:51

+0

下面是建立连接的代码: while(!connected){0} {0} {0} {0}请尝试以下代码:client = new Socket(); InetSocketAddress sa = new InetSocketAddress(serverIP,port); InetSocketAddress(serverIP,port); \t \t client.connect(sa); \t \t client.setKeepAlive(true); (UnknownHostException e){ \t} catch(UnknownHostException e){ \t \t e.printStackTrace(); \t \t return null; \t}赶上(IOException异常E){ \t ... \t} \t如果(client.isConnected()){ \t \t //设置超时阻止读取操作。 \t \t try { \t \t \t client.setSoTimeout(timeout * 1000); (SocketException e) \t \t connected = true; \t} } – arsenalfan 2009-08-25 05:07:54

回答

2

documentation说:

的选项必须在进入阻塞操作有效果启用。

也许你应该把它之前至少调用read()套接字之前建立到服务器的连接,
但很难说没有代码...

3

我在过去在处理SO_TIMEOUT在Windows中有几个问题。我相信设置这是“假设”来设置底层的套接字实现,这可能取决于操作系统并与注册表设置等相冲突。

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