17

我想使用 aSocketChannel并为其读/写方法设置超时。我试图为拥有我SocketChannel这样的套接字设置超时:

channel.socket().setSoTimeout(TIMEOUT);

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

4

3 回答 3

14

根据这篇文章, SocketChannel 的读取操作不会超时,但您可以通过另一种方式从通道读取来获得这种效果。

SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);

根据您设置的 socketTimeOut 从 WrappedChannel 读取将超时。

于 2012-02-05T15:41:20.377 回答
2

如果您熟悉使用 Java 选择器,您可以使用选择器自己模拟套接字超时。查看 sun.nio.ch.SocketAdaptor 很有帮助。

使用 Thread.interrupt() 应该小心。SocketChannel 是 InterruptibleChannel。当您阅读 InterruptibleChannel 的描述时,Thread.interrupt() 会导致关闭SocketChannel。如果要在超时后使用 SocketChannel,则不能使用 InterruptibleChannel 功能。

于 2013-08-22T08:31:08.840 回答
-1

你也可以考虑让你的频道不可阻塞,只使用 System.currentTimeMillis()。

于 2012-10-14T20:25:54.583 回答