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()。