我正在開發一個使用Netty的websocket應用程序。我想知道消息是否真的從源傳遞到目的地。特別是,假設一個客戶端和一個服務器有一個開放的通道並且交換一些消息一段時間。在某個時候,客戶端崩潰,但Netty頻道仍然活躍。我在發送消息之前嘗試使用isReachable(),但是這種方法在某些情況下似乎是錯誤的(例如,使用Win7的計算機已啓動,但isReachable()返回false)。現在,我的想法是實現一個使用ACK的機制,即服務器發送消息並且客戶端發送一個確認。要做到這一點,我需要一個超時時間來查看在一定的時間間隔之後,相應的ack是否沒有到達。 Netty中有類似的東西嗎?如何使用websocket檢查消息是否真的在Netty中傳遞?
0
A
回答
1
關於isReachable() - 它只是一個盡力而爲的API。該文檔指出它嘗試發送一個ICMP迴應請求或創建一個TCP連接到目標主機上的端口7,這兩個端口很可能被防火牆阻止。這是發生在你的情況?
至於承認,Netty並沒有將此作爲標準提供,但它不應該太難實現。首先,每條消息都需要通過某種標識符唯一識別,可能是一個序列號,但全局唯一標識符意味着您可以跨斷開連接進行恢復。然後你想創建一個組合的處理程序來實現ChannelInboundHandler和ChannelOutboundHandler(假設Netty 4)。當發送
消息- 添加消息到由它的id
- 索引的地圖創建與消息ID相關聯的定時器。將其添加到由消息ID
- 向前消息
當ACK被接收取消計時器並刪除從它們各自的地圖定時器和消息索引的另一地圖。如果定時器觸發,則使用關聯的ID來決定如何處理定時器和消息(可能會重新發送並重置定時器)。
Netty提供了一個HashedWheelTimer,用於高效地管理大量具有適合此類活動的分辨率的計時器。
您可能還想考慮對重試次數設置限制,以便停止並引發錯誤,而不是無限期地持續。
相關問題
- 1. Netty的WebSocket消息是否被壓縮?
- 2. WebSocket的Spring STOMP - 「私人」消息傳遞
- 3. android firebase消息傳遞。檢查設備組是否創建?
- 4. 如何在消息傳遞系統中創建檢查點?
- 5. 如何檢查是否WebSocket的連接
- 6. 消息傳遞與龍捲風websocket
- 7. 使用相同的WebSocket將消息傳遞到客戶端
- 8. Ruby websocket檢查用戶是否存在
- 9. 當消息可用時,JMS receiveNoWait()是否保證消息傳遞?
- 10. 如何檢查RichFaces組件rich:messages是否在Javascript中有消息?
- 11. 檢查是否有其他用戶登錄進行消息傳遞
- 12. 如何檢查joomla 2.5的消息隊列中是否有消息?
- 13. 檢查窗口是否是消息框
- 14. 如何在codeigniter中傳遞消息?
- 15. 如何檢查組件的p:消息是否已存在?
- 16. 使用Secure MIME的安全消息傳遞是否可靠?
- 17. Angular2/Websocket:如何返回傳入websocket消息的可觀察值
- 18. 如何在Fortran中檢查REAL是否作爲DOUBLE傳遞?
- 19. websocket消息是否會丟失?
- 20. Firefox是否有WebSocket消息限制?
- 21. 是否可以編碼WebSocket消息?
- 22. 如何檢查iMessage,運行時組消息傳遞?
- 23. 如何使用netty保護websocket
- 24. SetWindowLongPtr()如何傳遞消息?
- 25. 在netty中丟棄消息
- 26. Firebase雲消息傳遞是否被視爲消息代理?
- 27. 如何檢查參數是否傳遞給C中的函數?
- 28. 如何檢查塊中傳遞的void函數是否爲空?
- 29. 如何檢查隊列中是否有消息
- 30. 如何檢查網站是否正在顯示消息?
非常感謝您的回覆,johnstir。如果命令是由shell執行的,Win7會回覆ping請求,但不會由java執行。出於這個原因,我說這可能是一個小錯誤。 我不確定這是否對我的軟件「太多」。這就像聊天,所以它轉發了很多信息,軟件應該包含許多定時器。好吧,讓我們假設我的軟件試圖在沒有ACK的情況下盡力而爲,但是如果它只想在發送消息之前檢查仍然連接的客戶端呢?我們有哪些選擇是可接受的()? –
好吧,我的問題是這樣的:http://stackoverflow.com/questions/21677864/netty-writeandflush-with-future-is-successfull-to-killed-host 你也回答了! :) –
我應該強調isReachable()並不真正適合您的需求。我希望你已經找到了答案,但是關於有很多定時器的觀點,通常通過限制你可以在任何時候發送的消息數量來處理。因此,例如,您發送10封郵件並將它們放入隊列(稱爲發送窗口),並將其他郵件排隊在其他數據結構中。當一條消息被確認後,你將它從發送窗口中刪除,並從另一個隊列發送另一條消息,從而再次填充發送窗口。這限制了未完成的消息和定時器。 – johnstlr