セレクターで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);
}
問題は、2 つのパケット (メッセージ) が次々に到着すると、ほとんどすぐにセレクターが反応して最初のパケットを処理しますが、その後反応せず、対応するキーを「読み取り可能」としてマークして、2 番目のパケットを処理することです。次のメッセージが到着すると、セレクターはそれを処理し、その後、その「失われた」パケットを処理します。わかりません、どうすれば直せますか。チャネル バッファを減らそうとし、 でセレクタを起動しようとしましselector.wakeup()
たが、カップルの最初のメッセージを処理した直後にキーを「読み取り可能」と認識することに問題があるため、役に立ちませんでした。何か案は?