我有一个带有选择器的NIO实现的服务器。 的实现是相当简单:Java 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()
唤醒选择器,但它并没有帮助,因为问题与在处理第一条消息之后立即将密钥识别为“可读”有关。 有什么建议吗?
nio的代码是出了名的难以得到完全正确。这是一个非常棘手的API。除非你被要求为一个类做这件事,否则我会使用像netty这样的框架来隐藏这种复杂性。 – jtahlborn
选择器不会错过任何事件。你确定两个包真的到了吗? – EJP