java中的URLConnection如何重用池中的连接

Posted

技术标签:

【中文标题】java中的URLConnection如何重用池中的连接【英文标题】:How does URLConnection in java reuses the connection from the pool 【发布时间】:2011-11-25 08:38:54 【问题描述】:

谁能帮助我提供有关 URLConnection 如何重用连接的示例代码?

URLConnection con = new URL("http://www.someurl.com").openConnection();

我正在使用上面的代码来创建一个 URLConnection。第一次,URLConnection 将打开一个到指定 URL 的新连接。但之后它将重用池中的现有连接。有什么可以证明这一点(我的意思是通过 println())?

实际上有没有办法从池中检索连接重用状态?

【问题讨论】:

您可能能够“有线嗅探”以确认它实际上是在重用连接。或者检查服务器上的连接(假设它使用http keep-alives,这是我想象的唯一重用连接的情况......)另见***.com/q/3304006/32453 【参考方案1】:

来自java.net.URLjavadoc:

返回一个 URLConnection 对象,该对象表示与 URL 引用的远程对象。

每次都会打开一个新连接,通过调用 openConnection 此 URL 的协议处理程序的方法。

如果对于 URL 的协议(例如 HTTP 或 JAR),存在一个 公共的,专门的 URLConnection 子类,属于其中之一 以下包或其子包之一:java.lang、java.io、 java.util, java.net,返回的连接将属于该子类。 例如,对于 HTTP,将返回一个 HttpURLConnection,对于 JAR 将返回一个 JarURLConnection。

所以对于 http 协议 url,它将返回一个 HttpURLConnection

来自java.net.HttpURLConnectionjavadoc:

每个 HttpURLConnection 实例都用于发出单个请求 但是 到 HTTP 服务器的底层网络连接可能会被其他实例透明地共享

所以下划线的 tcp 连接可能会被池化

【讨论】:

好的。同意。但是有可能证明吗?如果您提供示例代码来证明 tcp 连接被池化和重用,将会非常有帮助。 @Dilip B S 不可能从代码中证明这一点,这就是它被设计成隐藏在引擎盖下的程度。您必须嗅探网络。 hmmm:) 但它似乎只是概念性的。所以也许有办法证明它......我们依赖java doc。如果要求是证明它,那么我们必须。 嗯,必须证明一个编程语言基础库能做到所说的有点奇怪。是否与必须为网络流量分析某种方法更相关? :-) 但我的要求是……无论如何感谢您的回复

以上是关于java中的URLConnection如何重用池中的连接的主要内容,如果未能解决你的问题,请参考以下文章

为啥线程没有在线程池中重用?

如何在java中重置URLConnection?

如何在 java.net.URLConnection 上指定本地地址?

Java:如何使用 UrlConnection 发布授权请求?

java线程池相关知识点总结

Java 线程池