繁体   English   中英

SocketChannel.read()在非阻塞通道上阻塞

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM