簡體   English   中英

TCP Netty確保收到消息

[英]TCP Netty Ensure message received

我正在創建客戶端 - 服務器系統,應該能夠在不穩定的網絡中工作。 它假定連接可能一次斷開,然后系統必須重新連接並繼續工作。 我正在使用Netty並遇到一個問題:我們如何知道我們發送的消息是否被其他主機接收?

我在想,為此可以使用ChannelFuture,如果附加的未來監聽器失敗,我可以簡單地嘗試再次發送消息:

ChannelFuture fut = channel.write(message);
fut.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            if (!future.isSuccess()) {
                LOGGER.error("Message send failed. Message: " + message, future.getCause());
                //Queue message to be send after reconnect
            } 
        }
});

但是,當我完成操作時,我注意到,該偵聽器永遠不會輸出錯誤。 (當我的系統幾乎無法正常工作時,我通過從網絡上拔下來測試了這一點)我也注意到我發送的消息的所有未來都進入“完成”狀態,並且無法確保收到消息(不使用確認消息)

據我所知,TCP協議保證會收到消息,在使用它時我們可以知道哪些發送包到達目的地,哪些不到。 我無法相信Netty不允許知道它。

有沒有一種好方法可以知道消息已經發送?

您誤解了TCP。 TCP不保證您的郵件已收到。 它提供可靠的有序字節流。 它對您的消息一無所知,也無法告訴您遠程主機何時接收到該消息。 因此,Netty也不能。 Netty只能告訴您消息在傳輸之前已被寫入操作系統緩沖區。 這是您的代碼正在檢測的內容。

為確保收到您的消息,接收方必須發回明確的確認。 實現此目標的最佳方法取決於協議的預期行為,但通常涉及維護已發送但尚未確認的所有消息的表。

您的所有未來都是將信息寫入網絡。

要保證接收,您必須實現確認或使用消息號並重新發送請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM