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

我们有一个类通过套接字与另一个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. 创建一个未连接的SocketChannel并在阻塞模式下进行定时连接。

要么

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