java - 使用 NIO SocketChannel 连接到套接字时超时

标签 java nio

我们有一个类通过套接字与另一个主机通信,它看起来像这样:

SocketChannel sc = SocketChannel.open(new InetSocketAddress(HOST, PORT));
sc.configureBlocking(true);

...
sc.write(...)
sc.read(...)

这个类工作得很好,除非主机关闭,然后 SocketChannel.open 永远阻塞。我尝试通过执行以下操作来超时:

SocketChannel  = SocketChannel.open();
sc.configureBlocking(false);
boolean result = socketChannel.connect(new InetSocketAddress(HOST, PORT));
if (!result) {
    long startTime = System.currentTimeMillis();
    while (!socketChannel.finishConnect()) {
        if (System.currentTimeMillis() - startTime< 1000) {
            // keep trying
            Thread.sleep(100);
        } else {
            // FAILED!
            enabled = false;
            return;
        }
    }
}
// SUCCESS!
socketChannel.configureBlocking(true);
enabled = true

由于某种原因,finishConnect() 永远阻塞,而我本希望它根本不会阻塞。有什么想法吗?

最佳答案

你做错了。

  1. 创建一个未连接的 SocketChannel 并在阻塞模式下执行定时连接。

或者

  • 在非阻塞模式下使用选择器。注册OP_CONNECT的 channel 并选择。当它变为可连接时,调用 finishConnect(),,如果返回 true,则取消注册 OP_CONNECT 并继续进行 I/O。如果返回 false,则继续选择。如果抛出异常,放弃连接,则失败。使用选择超时。不是旋转循环。
  • 关于java - 使用 NIO SocketChannel 连接到套接字时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369146/

    相关文章:

    java - 使用 NIO 选择器从客户端向服务器发送自定义消息

    java - 如何将数据写入套接字 channel

    java - java中从对象到字符串的转换

    java - 聊天应用程序 - 更新 token 聊天 fragment - 新版本

    java - 如何将 LocalContainerEntityManagerFactoryBean 设置为 JpaTransactionManager?

    java - 解析异常 MaskFormatter

    java - 非阻塞模式下的 ServerSocketChannel 未正确关闭

    Java NIO 和 SSL

    java - 如何使用 StAX 将属性添加到 XML 节点?

    Java NIO : OP_CONNECT never triggered in client, 即使服务器接受连接