套接字通道的超时不起作用

2022-09-03 07:10:54

我想使用一个,并为其读/写方法提供超时。我试图为拥有我的套接字设置一个超时,如下所示:SocketChannelSocketChannel

channel.socket().setSoTimeout(TIMEOUT);

但这行不通。还有其他解决方案吗?


答案 1

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

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

从包装的通道读取将根据您设置的套接字TimeOut超时。


答案 2

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

使用 Thread.interrupt() 时应小心。套接字通道是可中断通道。当您阅读可中断通道的说明时,Thread.interrupt() 会导致套接字通道关闭。如果要在超时后使用套接字通道,则不能使用可中断通道功能。


推荐