2014-03-14 61 views
0

我正在開發一個使用Netty的websocket應用程序。我想知道消息是否真的從源傳遞到目的地。特別是,假設一個客戶端和一個服務器有一個開放的通道並且交換一些消息一段時間。在某個時候,客戶端崩潰,但Netty頻道仍然活躍。我在發送消息之前嘗試使用isReachable(),但是這種方法在某些情況下似乎是錯誤的(例如,使用Win7的計算機已啓動,但isReachable()返回false)。現在,我的想法是實現一個使用ACK的機制,即服務器發送消息並且客戶端發送一個確認。要做到這一點,我需要一個超時時間來查看在一定的時間間隔之後,相應的ack是否沒有到達。 Netty中有類似的東西嗎?如何使用websocket檢查消息是否真的在Netty中傳遞?

回答

1

關於isReachable() - 它只是一個盡力而爲的API。該文檔指出它嘗試發送一個ICMP迴應請求或創建一個TCP連接到目標主機上的端口7,這兩個端口很可能被防火牆阻止。這是發生在你的情況?

至於承認,Netty並沒有將此作爲標準提供,但它不應該太難實現。首先,每條消息都需要通過某種標識符唯一識別,可能是一個序列號,但全局唯一標識符意味着您可以跨斷開連接進行恢復。然後你想創建一個組合的處理程序來實現ChannelInboundHandler和ChannelOutboundHandler(假設Netty 4)。當發送

消息
  • 添加消息到由它的id
  • 索引的地圖創建與消息ID相關聯的定時器。將其添加到由消息ID
  • 向前消息

當ACK被接收取消計時器並刪除從它們各自的地圖定時器和消息索引的另一地圖。如果定時器觸發,則使用關聯的ID來決定如何處理定時器和消息(可能會重新發送並重置定時器)。

Netty提供了一個HashedWheelTimer,用於高效地管理大量具有適合此類活動的分辨率的計時器。

您可能還想考慮對重試次數設置限制,以便停止並引發錯誤,而不是無限期地持續。

+0

非常感謝您的回覆,johnstir。如果命令是由shell執行的,Win7會回覆ping請求,但不會由java執行。出於這個原因,我說這可能是一個小錯誤。 我不確定這是否對我的軟件「太多」。這就像聊天,所以它轉發了很多信息,軟件應該包含許多定時器。好吧,讓我們假設我的軟件試圖在沒有ACK的情況下盡力而爲,但是如果它只想在發送消息之前檢查仍然連接的客戶端呢?我們有哪些選擇是可接受的()? –

+0

好吧,我的問題是這樣的:http://stackoverflow.com/questions/21677864/netty-writeandflush-with-future-is-successfull-to-killed-host 你也回答了! :) –

+0

我應該強調isReachable()並不真正適合您的需求。我希望你已經找到了答案,但是關於有很多定時器的觀點,通常通過限制你可以在任何時候發送的消息數量來處理。因此,例如,您發送10封郵件並將它們放入隊列(稱爲發送窗口),並將其他郵件排隊在其他數據結構中。當一條消息被確認後,你將它從發送窗口中刪除,並從另一個隊列發送另一條消息,從而再次填充發送窗口。這限制了未完成的消息和定時器。 – johnstlr

相關問題