我在当前的项目中使用了com.sun.net.httpserver.HttpsServer
,该项目涉及客户端认证等功能。目前它只打印客户端的地址/端口,以便我可以检查一个 TCP 连接是否用于多个请求(keep-alive
),或者每个请求是否建立一个新的连接(因此每次都要进行 SSL 握手)。当我使用 Firefox 对服务器发出多个请求时,可以看到 keep-alive 工作正常。所以服务器部分对 GET 和 POST 请求工作正常。
如果我使用 HttpURLConnection
向服务器发出请求(在这种情况下不使用 SSL),keep-alive
也可以工作:只为多个连续启动的请求建立一条连接。
但如果我使用 HttpsURLConnection
(使用完全相同的代码,但使用 SSL),那么 keep-alive
将不再工作。因此,每个请求都会建立一个新的连接,尽管我使用相同的 SSLContext
(和 SSLSocketFactory
):
// URL myUrl = ...
// SSLContext mySsl = ...
HttpsURLConnection conn = (HttpsURLConnection) myUrl.openConnection();
conn.setUseCaches(false);
conn.setSSLSocketFactory(mySsl.getSocketFactory());
conn.setRequestMethod("POST");
// send Data
// receive Data
我如何强制HttpsURLConnection
使用keep-alive
,因为许多请求会导致许多SSL握手,这是一个真正的性能问题?
更新(2012-04-02):
而不是每次调用mySsl.getSocketFactory()
,我尝试缓存SSLSocketFactory
。但是没有任何改变。问题仍然存在。
-Djava.net.debug=ssl
,但是没有发现任何问题。不过下次上班时我会再次检查。 - Biggie