簡體   English   中英

確保已收到`response.getOutputStream()。write()`

[英]make sure `response.getOutputStream().write()` was received

我以以下方式編寫對HTTP請求的response.getOutputStream().write()response.getOutputStream().write()

我想確保客戶收到了它。

由於TCP發送確認,因此它必須是可能的。

這個要求還意味着寫操作必須是阻塞操作(對我來說很好!)。

因此,我如何知道是否以上述方式完成(我懷疑不是這樣)? 有保證的規格嗎? 有什么辦法做到這一點? 我在使用Tomcat 6。

... PS,我的意思是除了讓客戶端在另一個HTTP請求中發送此確認之外,還有其他方法:)

首先,您可以確保刷新輸出流緩沖區:

response.getOutputStream().flush();

它保證了數據實際發送出去。 TCP將確保它到達,否則將給您的服務器一個錯誤,該錯誤將轉換為IOException。

簡而言之,如果您可以編寫但不會出錯,則您的客戶端確實收到了數據。 至少在TCP堆棧上。 客戶顯然負責消費消息。

TCP同時提供數據完整性和交付保證。 它將一直重新傳輸,直到接收器確認接收到數據包為止。 但是所有這些都發生在TCP堆棧內部。 您的代碼可以假設它發生了,或者您收到了錯誤。 僅這兩種情況是可能的。

另外,您可能要確保關閉輸出流,否則客戶端可能坐在那里緩沖數據,直到它接收到流的結束。

我希望這有幫助

TCP僅知道對等方已接收到數據。 它不知道對等應用程序已接收到數據。 由於TCP寫入是異步的,因此可以在寫入或刷新返回到發送應用程序后很長時間檢測到錯誤。

應用程序可以通過另一個HTTP事務確認接收,但是HTTP應該是無狀態的,這樣做會違反該規則。

我建議您查找“兩軍問題”。

相反,您應該做的是使交易成為冪等 (查找),然后客戶有責任確保交易發生。 如果客戶沒有得到回應,他應該只重復交易。 對重試次數設置一個較低的限制,例如兩次或三次。

您確定那是您想要的嗎? 測試寫入是否成功? TCP旨在確保其正常工作,如果數據包失敗,您將開始斷開連接和IOExeceptions。 實際上,您將獲得RunTimeException。 這樣做的方法是將響應發送回源。 然后等待響應出現。

當您等待時,請確保您等待了一段時間並放棄,以免您掛死。

假設您只想調試代碼。 如果要調試,請使用諸如ethereal之類的數據包嗅探器。 相信我,一旦您掌握正確的邏輯,就不需要ack數據包了。

暫無
暫無

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

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