我有一个服务器与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()唤醒选择器,但它没有帮助,因为问题与在hanling第一条消息后立即识别密钥为“可读”有关。有什么想法吗?
发布于 2015-05-04 05:29:34
听起来您需要先从选定关键点集中移除选择关键点,然后才能使用它们。如果您不这样做,当您调用selectedKeys()时,返回的set将仍然包含旧的、使用过的密钥。
大致是这样的:
Iterator iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = (SelectionKey) iter.next();
iter.remove(); // remove here
process(key);
}https://stackoverflow.com/questions/30019392
复制相似问题