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