У меня есть клиентское приложение, которое подключается к моему серверному приложению, и это все прекрасно, пока не получат сообщения от клиента. Сервер должен принимать сообщения от клиента и отправлять их нужному получателю. Я прошёл через мой сервер и, используя селектор, он выбирает любые входные данные, которые он получает, и, если это сообщение от клиента, он попадает в метод handleIncomingMessage. Проблема в том, что он регистрирует клиента, но никогда не получает попадания в метод handleIncomingMessage.
Я попытался изменить SelectionKey селектора как на сервере (с OP_ACCEPT до OP_CONNECT), так и на клиенте (с OP_ACCEPT на OP_READ и OP_WRITE), но, похоже, он не работает.
public void run(int port) {
this.port = port;
try {
selector = Selector.open();
bindAndListenToPort();
} catch (IOException e) {
System.out.println(Shared.getErrorMessage(20));
e.printStackTrace();
}
while (true) {
try {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
if (key.isAcceptable()) {
registerNewClient(key);
}
// Pending
else if (key.isReadable()) {
handleIncomingMessage(key);
}
iterator.remove();
}
} catch (IOException e) {
System.out.println(Shared.getErrorMessage(21));
}
}
}
private void registerNewClient(SelectionKey key) throws IOException {
SocketChannel client = serverSocket.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
client.register(selector, SelectionKey.OP_WRITE);
}
private void bindAndListenToPort() throws IOException {
serverSocket = ServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress("localhost", port));
serverSocket.configureBlocking(false);
serverSocket.register(selector, SelectionKey.OP_ACCEPT);
}
``
I expected the server to hit the handleIncomingMessage method, but it never does (I chose not to include the actual method in my example because what it does currently is not relevant.)