我正在使用Java NIO作爲點對點協議,並且需要創建多個同時連接,其中很多會失敗。不幸的是,似乎我需要等待連接建立之前建立下一個,否則我會得到一個「BindException:不能分配請求的地址:連接」。有沒有人有一個想法如何解決這個問題?在Java中同時創建多個傳出連接NIO
for (NetworkAddress address : addresses) {
if (isConnectedTo(address)) {
continue;
}
try {
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress(address.toInetAddress(), address.getPort()));
// admittedly, 20 seconds is quite long
long timeout = System.currentTimeMillis() + 20_000;
while (!channel.finishConnect() && System.currentTimeMillis() < timeout) {
// Without this loop, I get said exception
}
if (!channel.finishConnect()) {
channel.close();
continue;
}
ConnectionInfo connection = new ConnectionInfo(ctx, CLIENT,
address,
listener,
requestedObjects, 0
);
connections.put(
connection,
channel.register(selector, OP_READ | OP_WRITE, connection)
);
} catch (NoRouteToHostException | AsynchronousCloseException ignore) {
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
}
永遠不要發生異常,不要處理它。 Like your noroutetohostexception – Jens
連接完成之前您無法使用連接,但可以有任意數量的掛起連接。 –
@Jens:我幾乎同意,但我希望有一些主機沒有路由,除了嘗試下一個主機外,沒有什麼可做的。另一個也是預期的(發生在關閉時),但如果發生在其他場合,我可能想記錄它。 – Chris