1

セレクターで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()たが、カップルの最初のメッセージを処理した直後にキーを「読み取り可能」と認識することに問題があるため、役に立ちませんでした。何か案は?

4

1 に答える 1

0

それらを使用する前に、選択されたキーセットから選択キーを削除する必要があるようです。これを行わないと、 を呼び出したときにselectedKeys()、返されるセットには古い使用済みのキーが含まれたままになります。

次のようなもの:

 Iterator iter = selector.selectedKeys().iterator();  
 while (iter.hasNext()) {  
     SelectionKey key = (SelectionKey) iter.next();  
     iter.remove();  // remove here 
     process(key);  
 }
于 2015-05-03T21:29:33.633 に答える