我有一個帶有選擇器的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