【发布时间】:2013-04-28 11:04:12
【问题描述】:
我们有一个类通过套接字与另一个主机通信,它看起来像这样:
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() 会永远阻塞,而我本以为它根本不会阻塞。有什么想法吗?
【问题讨论】:
-
阻塞是 NIO 的默认行为,所以你不需要设置它顺便说一句,即使大多数人认为它是关于非阻塞 IO。 AFAIK,您无法更改阻止模式。
-
@PeterLawrey 当然可以。这就是 'configureBlocking()' 的用途。
-
@EJP 感谢您的更正。我还没有看到它在一个区块中使用过,后来又换成了另一个。
-
@PeterLawrey 是的,你有。每个通道都以阻塞模式开始,因此每个使用选择器的程序都会显示更改为非阻塞模式。我不明白你的问题。