Прикрепление пакета Java NIO

У меня есть сервер с реализацией NIO с селектором. Реализация довольно проста:

            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(), но это не помогло, потому что проблема связана с распознаванием ключа как "читаемого" сразу после передачи первого сообщения в паре. Есть идеи?

1 ответ

Похоже, вам нужно удалить клавиши выбора из набора выбранных клавиш перед их использованием. Если вы этого не сделаете, когда вы звоните selectedKeys()возвращенный набор будет по-прежнему содержать старые использованные ключи.

Что-то вроде:

 Iterator iter = selector.selectedKeys().iterator();  
 while (iter.hasNext()) {  
     SelectionKey key = (SelectionKey) iter.next();  
     iter.remove();  // remove here 
     process(key);  
 }
Другие вопросы по тегам