Я использую Java NIO для однорангового протокола и вам необходимо создать много одновременных соединений, из-за которых многие не будут работать. К сожалению, кажется, что мне нужно подождать, пока соединение будет установлено до создания следующего, иначе я получу «BindException: не могу назначить запрошенный адрес: connect». Кто-нибудь есть идея, как это исправить?Создайте несколько исходящих подключений одновременно в 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);
}
}
Никогда не ловите исключения и не обрабатывайте его. Как и ваше noroutetohostexception – Jens
Вы не можете использовать соединение до его завершения, но вы можете иметь любое количество ожидающих подключения. –
@Jens: Я почти согласен, но я ожидаю, что нет пути к некоторым хостам, и нечего делать, кроме попытки следующего. Ожидается и другое (происходит при выключении), но я могу зарегистрироваться, если это произойдет в других случаях. – Chris