我想使用SocketChannel
并使其读/写方法超时。我试图为拥有SocketChannel
的Socket设置超时,如下所示:
channel.socket().setSoTimeout(TIMEOUT);
但这不起作用。还有其他解决方案吗?
答案 0 :(得分:14)
根据这个article,SocketChannel不会因读取操作而超时,但你可以通过另一种方式从通道读取来获得此效果。
SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);
从wrappedChannel读取将根据您设置的socketTimeOut超时。
答案 1 :(得分:2)
如果您熟悉使用Java Selector,则可以使用selector自行模拟套接字超时。看sun.nio.ch.SocketAdaptor。
很有帮助使用Thread.interrupt()时应该小心。 SocketChannel是InterruptibleChannel。当您阅读InterruptibleChannel的描述时,Thread.interrupt()会导致关闭 SocketChannel。 如果要在超时后使用SocketChannel,则不能使用InterruptibleChannel功能。
答案 2 :(得分:-1)
你也可以考虑让你的频道不可阻止,只使用System.currentTimeMillis()。