我有一台带有选择器的 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()
,但这没有帮助,因为问题与在处理这对夫妇的第一条消息后立即将密钥识别为“可读”有关。有任何想法吗?