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

时间:2013-05-03 23:51:03

标签: java nio

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

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

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

除非HOST已关闭,否则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 个答案:

答案 0 :(得分:4)

你做错了。

  1. 创建未连接的SocketChannel并在阻止模式下进行定时连接。
  2. OR

    1. 在非阻止模式下使用Selector。注册OP_CONNECT频道并选择。当它变为可连接时,调用finishConnect(),,如果它返回true,则取消注册OP_CONNECT并继续I / O.如果返回false,请继续选择。如果它抛出异常,放弃连接,它就失败了。使用选择超时。不是旋转循环。