У меня есть сервер с реализацией NIO с селектором. Реализация довольно проста:Java NIO package sticking
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
if (! key.isValid()) {
continue;
}
UserConnection connection = users.get(key);
if (key.isReadable()) {
processReadableKey(key, connection);
} else if (key.isWritable()) {
processWritableKey(key, connection);
}
Дело в том, когда два пакета (сообщения) прибывает один за другим почти сразу, селектор реагирует и обрабатывает первый, но он не реагирует и отмечает соответствующий ключ как «читаемый» для обработки второго. Когда приходит следующее сообщение, селектор обрабатывает его и после этого обрабатывает этот «потерянный» пакет. Не знаю, как это исправить. Я попытался уменьшить буфер канала, и я попытался разбудить селектор на selector.wakeup()
, но это не помогло, потому что проблема связана с распознаванием ключа как «читаемого» сразу после hanling первого сообщения в паре. Любые идеи?
NiO код, как известно, трудно получить точно. это очень сложная апи. если вам не требуется делать это для класса, я бы пошел с фреймворком вроде netty, который скрывает эту сложность под капотом. – jtahlborn
Селектор не пропускает события. Вы уверены, что действительно были действительно два пакета? – EJP