我使用DefaultHttpClient
與Android(2.3.x版本)一ThreadSafeClientConnManager
發送HTTP請求到我的REST服務器(嵌入式碼頭)。爲什麼DefaultHttpClient通過半關閉套接字發送數據?
的空閒時間〜200秒之後,服務器關閉與一個[FIN] TCP連接。 Android客戶端以[ACK]響應。這應該並且確實將套接字置於半關閉狀態(服務器仍在監聽,但不能發送數據)。我期望當客戶端嘗試再次使用該連接(通過HttpClient.execute
)時,DefaultHttpClient
會檢測到半關閉狀態,關閉客戶端的套接字(因此發送它[FIN/ACK]來完成關閉),併爲請求打開一個新的連接。但是,這是一個問題。
相反,它發送過來的半封閉插座新的HTTP請求。只有在發送完成後,纔會檢測到半關閉狀態,並在客戶端關閉套接字(將[FIN]發送到服務器)。當然,服務器無法響應請求(它已經發送了它的[FIN]),所以客戶端認爲請求失敗,並通過新的套接字/連接自動重試。
最終的結果是,服務器發現和處理該請求的兩個副本。
有關如何解決此問題的任何想法? (我的服務器用第二個副本做了正確的事情,但我很煩惱有效負載發送了兩次。)
不應該在首次嘗試寫入新HTTP數據包時檢測到套接字已關閉,立即關閉該套接字,並開始一個新的?我很困惑,在服務器發送[FIN]之後的幾分鐘內,如何在一個套接字上發送新的HTTP請求。
'AndroidHttpClient'不完全相同的行爲(即一個'DefaultHttpClient'用'ThreadSafeClientConnManager'保證線程安全)......或許你可以嘗試使用?我不太瞭解有關套接字連接如何工作的詳細信息,但只是一個建議... –