java - 了解 URLConnection 连接是否真的被合并?

标签 java android

我正在为我的 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

但是,如果我在 < 5 秒的时间内单击测试按钮两次,第二次运行似乎跳过了握手,我立即看到“应用程序数据”消息。我想我记得在某处读到 URLConnection 仅将连接池保持 5 秒。

所以我的问题:

  1. URLConnection 能否真正按照我想要的方式汇集我的连接,因为后续连接可以跳过 https 握手(如果访问相同的域)?
  2. 如果上述情况可行,是否有办法增加连接在池中的持续时间?我的应用程序不太可能在 5 秒内彼此进行 HTTP 调用。
  3. 我知道 HttpClient 提供了一个池管理器来重用连接,但看起来比 URLConnection 更复杂。如果他们不满足我的需要,它能让我绕过#1 和 2 吗?

谢谢

最佳答案

您可以使用 Keep-Alive header 属性来保持任何 http 连接。这是有关 Http Keep-alive Http Keep Alive 的文档

What can you do to help with Keep-Alive 部分提供了您正在寻找的确切信息。 SO 中的快速搜索给了我另一个与您的问题完全相同的链接。

SO disucssion link

关于java - 了解 URLConnection 连接是否真的被合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737901/

相关文章:

java - 如何更新 JAXB 中的特殊元素?

java - Flink 将 csv 文件映射到元组中

java - apache poi excel小时格式设置单元格值java

php - 从 Android 手机上传图片到笔记本电脑需要太长时间,最后上传时显示“Windows 照片查看器无法显示,因为文件为空”

java - Android 布局的动态内容

java - 使用多个数据库连接会导致死锁

java - 扩展 cardview 类在卡片周围显示白色矩形

java - Activity 的成员范围和 Asynctask

java - 如何接收来自特定号码的短信?

java - Android:追加到文件而不是覆盖