2014-10-22 47 views
-1

我一直在試圖找出如何在客戶端強制終止連接或者客戶端一般失去連接時調用方法。目前,我的所有在線帳戶都有一個列表<>,但如果玩家沒有自然退出服務器,該帳戶將保留在列表中。Netty - 調用連接終止的方法

我一直在尋找的文件,並在幾十種不同的方式搜索谷歌措辭我的問題,但我找不到我正在尋找的答案。

基本上,我需要一種方法來確定哪個通道已斷開連接,並將其作爲參數傳遞給方法,這可能嗎?它幾乎必須是。

回答

1

我想這可以在客戶端和服務器端使用線程來完成。

在客戶端類中設置一個Date變量lastActive,每隔5min由客戶端設置一次(比方說)。另一個線程將每10分鐘從服務器端運行一次以檢查此標誌,如果lastActive超過10分鐘,則從列表中刪除播放器。您可以根據需要更改此頻率時間

+0

我想過這樣做,但是如果在多人團隊突襲期間玩家在10分鐘檢查後一分鐘後斷開連線,他將無法再登錄9分鐘,因爲他的「帳戶已登錄。「?這聽起來不太有效。當連接強制關閉時會拋出異常,但我無法弄清楚它是哪個異常,(我想我不會再拋棄它了,但我曾經這麼做) – Hobbyist 2014-10-22 19:24:51

0

可靠地檢測套接字斷開連接是一個常見問題,並非Netty特有的。您所描述的問題是您的對等方可能無法可靠地終止其連接的結束。例如:對等失去能力,對等應用程序崩潰,對等機器崩潰等等......一種常見的解決方案是關閉連接,如果沒有檢測到讀取活動超過一段時間間隔。 Netty提供了一些實用程序來緩解此過程,例如ReadTimeoutHandler。設置時間間隔是特定於應用程序的,並取決於您的協議。如果您希望的時間間隔足夠小,您可能需要在協議中添加額外的消息以作爲心跳消息(一個簡單的請求/響應以指示每一方正在相互通話)。

從Netty特定的角度來看,您可以註冊一個收聽者頻道的CloseFuture,當頻道關閉時會通知您。如果按照前面所述設置ReadTimeoutHandler,那麼在超時間隔過去並且沒有檢測到活動或通道正常關閉後,您將收到關閉事件的通知。

+0

@ Christian.tucker - 任何想法或問題嗎?這不是你要找的答案嗎? – 2014-10-28 01:17:52