首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpURLConnection实现

HttpURLConnection实现
EN

Stack Overflow用户
提问于 2010-08-11 17:12:13
回答 6查看 29.9K关注 0票数 17

我读过HttpURLConnection支持持久连接,这样连接就可以被重用到多个请求中。我试过了,发送第二篇文章的唯一方法是第二次打电话给openConnection。否则,我将得到一个IllegalStateException(“已经连接”);我使用了以下方法:

代码语言:javascript
复制
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的源代码,并且实现保持了连接到相同目的地的缓存。我的问题是,在发送第一个请求之后,我无法看到连接是如何返回到缓存中的。断开连接会关闭连接,如果没有断开连接,我仍然无法看到连接是如何放回缓存中的。我看到缓存有一个run方法可以遍历所有的空闲连接(我不确定它是如何被调用的),但是我无法找到连接是如何被放回缓存中的。唯一出现的地方似乎是在完成的httpClient方法中,但这并不是一个带有响应的帖子。有人能帮我吗?

编辑我感兴趣的是,如何正确处理HttpUrlConnection对象以实现连接重用。输入/输出流是否应该关闭,然后是一个url.openConnection();每次发送新请求(避免断开连接())?如果是,当我第二次调用url.openConnection()时,我无法看到连接是如何被重用的,因为第一个请求已经从缓存中删除了该连接,并且无法找到如何返回该连接。是否可能没有将连接返回到保活缓存(Bug),但OS尚未释放tcp连接,而在新连接上,OS返回缓冲连接(尚未发布)或类似的东西?EDIT2是我发现的唯一关联来自KeepAlive

...when应用程序对由URLConnection.getInputStream()返回的InputStream调用URLConnection.getInputStream(),JDK的HTTP协议处理程序将尝试清理连接,如果成功,则将连接放入连接缓存以供将来的HTTP请求重用。

但我不确定这是哪个处理程序。sun.net.www.protocol.http.Handler没有像我看到的那样做任何缓存,谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-12 01:41:42

输入/输出流是否应该关闭,然后是一个url.openConnection();每次发送新请求(避免断开连接())?

是。

如果是,当我第二次调用url.openConnection()时,我无法看到连接是如何被重用的,因为第一个请求已经从缓存中删除了该连接,并且无法找到如何返回该连接。

您正在将HttpURLConnection与基础Socket及其基础Socket连接混淆。他们是不一样的。HttpURLConnection实例是GC的,底层的Socket是池的,除非您调用disconnect().

票数 17
EN

Stack Overflow用户

发布于 2010-08-11 18:23:42

来自javadoc for HttpURLConnection (我的重点是):

每个HttpURLConnection实例都用于发出单个请求,但是到HTTP服务器的底层网络连接可能被其他实例透明地共享。在请求后调用HttpURLConnection的InputStream或OutputStream上的close()方法可以释放与此实例相关的网络资源,但对任何共享的持久连接都没有影响。如果某个持久连接当时处于空闲状态,则调用()方法可以关闭基础套接字。

票数 7
EN

Stack Overflow用户

发布于 2010-08-12 12:09:46

我发现当InputStream关闭时,连接确实被缓存。一旦inputStream被关闭,底层连接就会被缓冲。但是,HttpURLConnection对象不能用于进一步的请求,因为对象仍然被认为是“连接的”,也就是说,它的布尔连接被设置为true,并且在连接被放回缓冲区后不会被清除。因此,每次应该为新的POST实例化一个新的HttpUrlConnection,但是如果底层的TCP连接没有超时,它将被重用。所以EJP的答案是正确的描述。可能是我看到的行为,( TCP连接的重用),尽管显式调用disconnect()是由于操作系统所做的缓存?我不知道。我希望知道的人能解释。谢谢。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3460990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档