我有一个简单的行为不端的服务器(用Groovy编写)
ServerSocket ss = new ServerSocket(8889);
Socket s = ss.accept()
Thread.sleep(1000000)
我想超时的客户端(因为服务器没有使用它的输入)
Socket s = new Socket("192.168.0.106", 8889)
s.setSoTimeout(100);
s.getOutputStream.write( new byte[1000000] );
但是,此客户端将永远阻塞.如何使客户端超时?
谢谢!!
解决方法:
您可以在其自己的线程中生成客户端,并在其上旋转锁/等待(超时时间长)以返回.如果Socket成功,则可能使用Future对象获取返回值.
我确实相信,套接字的SO_TIMEOUT设置只会影响从套接字的read(..)调用,而不会影响写入.
您可以尝试使用SocketChannel(而不是Stream),并生成另一个具有该Channel句柄的线程.另一个线程可以在某个超时被阻止后异步关闭该通道.