Привет , поэтому позвольте мне получить это прямо. Что вы хотите сделать, это создать сервер, который может прослушивать несколько портов, и когда вы получаете новое соединение, вы хотите иметь возможность определить, какой порт это соединение использовало, это правильно? Хорошо, если это так, вы можете сделать это очень легко с помощью пакета java.nio
.
Мы будем использовать Selector для выбора готовности и ServerSocketChannel для прослушивания входящих соединений.
Сначала нам нужно объявить наш Selector
.
Selector selector = Selector.open();
Теперь давайте создадим список портов для прослушивания и начнем их прослушивание.
int ports[] = new int[] { 1234, 4321 };
// loop through each port in our list and bind it to a ServerSocketChannel
for (int port : ports) {
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(port));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
Теперь для процесса обработки SelectionKey
.
while (true) {
selector.select();
Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey selectedKey = selectedKeys.next();
if (selectedKey.isAcceptable()) {
SocketChannel socketChannel = ((ServerSocketChannel) selectedKey.channel()).accept();
socketChannel.configureBlocking(false);
switch (socketChannel.socket().getPort()) {
case 1234:
// handle connection for the first port (1234)
break;
case 4321:
// handle connection for the secon port (4321)
break;
}
} else if (selectedKey.isReadable()) {
// yada yada yada
}
}
}
Возможно, оператор переключения не требуется для такой простой задачи, но для простоты чтения и понимания.
Помните, что этот сервер настроен неблокирующим асинхронным способом, поэтому все выполняемые вами вызовы ввода / вывода не будут блокировать текущий поток. Поэтому НЕ инициируйте новые потоки в процессе обработки SelectionKey
.
Кроме того, я знаю, что это не полностью отвечает на ваш вопрос (может, может и нет), но на самом деле даст вам понимание того, как использовать пакет java.nio
для создания неблокирующего асинхронного сервера. которые могут прослушивать несколько портов.