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);
                }

问题是,当两个数据包(消息)几乎立即一个接一个地到达时,选择器会做出反应并处理第一个,但随后它不会做出反应并将相应的键标记为“可读”以处理第二个。当下一条消息到达时,选择器处理它,然后处理那个“丢失”的数据包。我不知道,如何解决它。我尝试减少通道缓冲区,并尝试通过 唤醒选择器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 回答