我使用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'保证线程安全)......或许你可以尝试使用?我不太了解有关套接字连接如何工作的详细信息,但只是一个建议... –