我正在为我的 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 秒。
所以我的问题:
- URLConnection 能否真正按照我想要的方式汇集我的连接,因为后续连接可以跳过 https 握手(如果访问相同的域)?
- 如果上述情况可行,是否有办法增加连接在池中的持续时间?我的应用程序不太可能在 5 秒内彼此进行 HTTP 调用。
- 我知道 HttpClient 提供了一个池管理器来重用连接,但看起来比 URLConnection 更复杂。如果他们不满足我的需要,它能让我绕过#1 和 2 吗?
谢谢
最佳答案
您可以使用 Keep-Alive header 属性来保持任何 http 连接。这是有关 Http Keep-alive Http Keep Alive 的文档
What can you do to help with Keep-Alive 部分提供了您正在寻找的确切信息。 SO 中的快速搜索给了我另一个与您的问题完全相同的链接。
关于java - 了解 URLConnection 连接是否真的被合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737901/