了解 URLConnection 连接是不是真的被池化了?
Posted
技术标签:
【中文标题】了解 URLConnection 连接是不是真的被池化了?【英文标题】:Understanding if URLConnection connections are really being pooled?了解 URLConnection 连接是否真的被池化了? 【发布时间】:2012-01-05 05:01:37 【问题描述】:我正在为我的 http 客户端使用 URLConnection。使用 Wireshark,我可以看到设置 https 连接最多需要四秒钟。因此,如果可能的话,我想汇集连接以避免 https 设置时间。我的流程如下所示:
public String work(String url)
HttpURLConnection conn = (HttpURLConnection)(new URL(url)).openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String response = br.readResponseFromConnection();
conn.disconnect();
br.close();
return response;
public void onBtnClickTest()
work("https://example.com/echo?param=abc");
使用上面的设置,我点击了我的测试按钮两次,但似乎每次调用都完成了 https 设置,这让我认为连接并没有真正被重用(至少不是我以前的方式)希望)。通过 Wireshark,我看到如下内容:
// first click
Client Hello
Server Hello
Certificate, Server Hello Done
Client Key Exchange, Change Cipher Spec, Encrypted...
Encrypted Handshake Message...
Application Data
// second click, 20 seconds after my first click.
Client Hello
Server Hello
Certificate, Server Hello Done
Client Key Exchange, Change Cipher Spec, Encrypted...
Encrypted Handshake Message...
Application Data
但是,如果我在
所以我的问题:
-
URLConnection 是否可以按照我想要的方式实际汇集我的连接,因为后续连接可以跳过 https 握手(如果访问同一个域)?
如果上述情况可行,有没有办法增加连接保持池的持续时间?我的应用不太可能在 5 秒内互相发起 http 调用。
我知道 HttpClient 提供了一个池管理器来重用连接,但看起来比 URLConnection 更复杂。如果他们不做我需要的事情,它能让我绕过 #1 和 2 吗?
谢谢
【问题讨论】:
How does URLConnection in java reuses the connection from the pool的可能重复 【参考方案1】:您可以使用 Keep-Alive 标头属性来持久化任何 httpconnection。这是关于 Http Keep-alive Http Keep Alive
的文档您可以做些什么来帮助 Keep-Alive 部分提供了您正在寻找的确切信息。 SO中的快速搜索给了我另一个链接,这与你的问题完全一样。
SO disucssion link
【讨论】:
嗨,HttpURLConnection 文档说 Keep-Alive 默认开启。您链接到的文档没有提到连接池的时间长度(我相信这可能因实现而异)。有没有办法控制这个持续时间?谢谢 这是我指的android上HttpURLConnection的文档:developer.android.com/reference/java/net/HttpURLConnection.html 这也是我读到的关于连接仅被池化 5 秒的地方:java.net/node/656952“否则,超时只有 5 秒,之后套接字将不会被重用”。我想知道 HttpClient 是否具有相同的超时限制。不幸的是,除非服务器返回超时值以使其兑现,否则您似乎无法在 HttpURLConnection 中更改它? 我认为没有办法可以控制 Keep-Alive。我的猜测是,如果超过 5 个连接,则可能会取出上次使用时间最长的连接。我怀疑 5 秒的评论,找不到任何具有该时间限制的官方文档。 同意我也找不到任何文档,只是用 Wireshark 反复试验。如果我在 5 秒,则重新设置整个过程。以上是关于了解 URLConnection 连接是不是真的被池化了?的主要内容,如果未能解决你的问题,请参考以下文章
URLConnection,为啥有两个不同的超时? (连接并阅读)[重复]