2009-09-30 113 views
7

我已經編寫了一個使用Java NIO API執行非阻塞IO的服務器。我發現偶爾客戶端應用程序突然關閉(例如,由於斷電)並且連接在服務器端保持打開狀態。NIO - 檢測已關閉的連接

一位同事遇到了同樣的問題,並說他在線上使用心跳檢測這種事情,但我希望有一個更簡單的方法。有其他人遇到過這個問題嗎?

一些額外的信息:我的當前服務器設計將取消一個密鑰,並關閉相應的通道,如果它在嘗試讀取/寫入操作時捕獲到IOException。這種方法似乎在99%的時間內工作;我只看到了一些連接似乎處於打開狀態的情況。

回答

6

沒有應用程序級別的心跳,你唯一的選擇就是依靠TCP keepalive。但默認時間間隔很長(如2小時)。 RFC建議不要超過2小時。

您可以縮短它,但這是一個系統範圍的參數。在某些操作系統上,它甚至需要內核重建來改變它。

因此,強烈建議任何基於TCP協議的心跳。

+0

謝謝ZZ編碼器 - 這就是我認爲(擔心)。我很驚訝這不是TCP的一個特性。 – Adamski 2009-09-30 15:02:24

+0

「平」而不是,這些應用程序不是人類 - 你知道。 – 2011-03-22 21:01:45