1

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

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() 会永远阻塞。有任何想法吗?

4

1 回答 1

5

你这样做是错误的。

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

或者

  1. Selector在非阻塞模式下使用 a 。注册频道OP_CONNECT并选择。当它变得可连接时,调用finishConnect(),如果它返回 true,则取消注册OP_CONNECT并继续 I/O。如果返回 false,请继续选择。如果它抛出异常,放弃连接,它就失败了。使用选择超时。不是自旋循环。
于 2013-05-04T00:21:29.603 回答