SocketChannel的超时不起作用

时间:2010-05-19 14:42:43

标签: java socketchannel

我想使用SocketChannel并使其读/写方法超时。我试图为拥有SocketChannel的Socket设置超时,如下所示:

channel.socket().setSoTimeout(TIMEOUT);

但这不起作用。还有其他解决方案吗?

3 个答案:

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