我读过 HttpURLConnection 支持持久连接,因此一个连接可以重复用于多个请求。我试过了,发送第二个 POST 的唯一方法是第二次调用 openConnection。否则我得到一个 IllegalStateException("Already connected"); 我使用了以下内容:
try{
URL url = new URL("http://someconection.com");
}
catch(Exception e){}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//set output, input etc
//send POST
//Receive response
//Read whole response
//close input stream
con.disconnect();//have also tested commenting this out
con = (HttpURLConnection) url.openConnection();
//Send new POST
第二个请求是通过同一个 TCP 连接发送的(使用wireshark 验证),但我不明白为什么(尽管这是我想要的),因为我已经调用了断开连接。我检查了 HttpURLConnection 的源代码,并且该实现确实保留了到相同目的地的连接的保活缓存。我的问题是,在我发送第一个请求后,我看不到连接是如何放回缓存中的。断开连接关闭连接并且没有断开连接,我仍然看不到连接是如何放回缓存中的。我看到缓存有一个运行方法来遍历所有空闲连接(我不确定它是如何调用的),但我找不到连接是如何放回缓存中的。似乎发生的唯一地方是在 httpClient 的完成方法中,但这不是为带有响应的 POST 调用的。谁可以帮我这个事?
编辑 我的兴趣是,正确处理 HttpUrlConnection 对象以重用 tcp 连接的方法是什么。应该关闭输入/输出流,然后是 url.openConnection(); 每次发送新请求(避免断开())?如果是的话,当我第二次调用 url.openConnection() 时,我看不到连接是如何被重用的,因为第一次请求的连接已经从缓存中删除并且找不到它是如何返回的。连接是否有可能没有返回到keepalive缓存(错误?),但操作系统尚未释放tcp连接并且在新连接上,操作系统返回缓冲连接(尚未释放)或类似的东西? EDIT2 我发现的唯一相关来自JDK_KeepAlive
...当应用程序对 URLConnection.getInputStream() 返回的 InputStream 调用 close() 时,JDK 的 HTTP 协议处理程序将尝试清理连接,如果成功,则将连接放入连接缓存以供将来的 HTTP 请求重用.
但我不确定这是哪个处理程序。sun.net.www.protocol.http.Handler 没有做任何缓存,因为我看到了谢谢!