![](/img/trans.png)
[英]How can I test if a SocketChannel.read() for a non-blocking channel has finished?
[英]SocketChannel.read() blocks on a non-blocking channel
我偶尔遇到过SocketChannel.read()
在非阻塞通道上阻塞的情况(RH6上的JDK 1.6变体)。 我对规范的解读说,这绝不应该发生。 向套接字添加一个大的超时(我认为不应该真的需要......)后,我看到以下内容: java.io.IOException: Connection timed out at sun.nio.ch.FileDispatcherImpl.read0(Native method) ... at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ...
查看源代码,这只是调用read()
,大概不应该使用O_NONBLOCK阻塞文件描述符组。
(这可能类似于: SocketChannel.read()无限期地阻塞 ,但是在我的情况下,通道肯定被配置为非阻塞,并且同步在这里真的应该无关紧要,因为呼叫不应该阻塞而不管其他任何其他注意事项。)
我知道非阻塞的read()
可能因为 - 比如说 - 分页而阻塞,但是我的套接字超时设置了几分钟,因此分页实际上不是罪魁祸首。
有任何想法吗?
安装代码是:
public void addConnection(SocketChannel channel) throws SocketException {
channel.socket().setTcpNoDelay(true);
channel.socket().setReceiveBufferSize(defReceiveBufferSize);
channel.socket().setSendBufferSize(defSendBufferSize);
channel.socket().setSoTimeout(defSocketReadTimeout);
try {
channel.configureBlocking(false);
} catch (IOException ioe) {
Log.logErrorWarning(ioe);
throw new RuntimeException("Unable to configure non-blocking socket");
...
}
“连接超时”表示网络错误,而不是读取超时。
这里没有证据表明读取实际上已被阻止。 网络错误已经存在,等待I / O操作报告。 抛出此异常后立即返回read()
。
在非阻塞套接字通道上设置读取超时没有任何意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.