Прикрепление пакета 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);
}