了解 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,为啥有两个不同的超时? (连接并阅读)[重复]

UrlConnection连接和Socket连接的区别

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

URLConnection-URL连接

你真的了解 advice, joinpoint,pointcut,aspect吗?

你真的了解WebSocket吗?