[RedHat企业Linux服务器.Java版本8. Jersey版本2.21.]
在泽西有没有办法使HTTPS客户端连接持久存在?
(我正在读取HTTPS连接是持久的,但这不是我在客户端看到的行为.)
我想创建一个连接,使用相同的连接POST一些消息,最后断开连接.我想保持连接打开,而不是在POST之间关闭.
我有以下java Jersey代码:
// target is WebTarget
Response resp = target.request(mediaType).header("Connection", "keep-alive").post(Entity.entity(message, mediaType));
for (i = 0; i < 5; i++) {
Thread.sleep(5000);
LogService.log(srcId, LogLevel.TRACE, "Sleeping...");
}
// log succeeded or failed message here
Run Code Online (Sandbox Code Playgroud)
在netstat中,我看到ESTABLISHED连接显示,保持6-8秒,然后消失.我希望它保持打开状态,因此下一个POST可以使用相同的连接而无需重新连接.
使用-Djavax.net.debug = all运行,我看到连接设置和POSTed数据:
... %% Cached client session: [Session-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256] [read] MD5 and SHA1 hashes: len = 16 ... Padded plaintext before ENCRYPTION: len = 288 ... 0010: 50 4F 53 54 20 2F 41 41 41 2F 4D 4E 4F 50 2F 20 POST /AAA/MNOP/ 0020: 48 54 54 50 2F 31 2E 31 0D 0A 41 63 63 65 70 74 HTTP/1.1..Accept 0030: 3A 20 74 65 78 74 2F 70 6C 61 69 6E 3B 20 63 68 : text/plain; ch 0040: 61 72 73 65 74 3D 61 73 63 69 69 0D 0A 43 6F 6E arset=ascii..Con 0050: 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C nection: keep-al 0060: 69 76 65 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 ive..Content-Typ 0070: 65 3A 20 74 65 78 74 2F 70 6C 61 69 6E 3B 63 68 e: text/plain;ch 0080: 61 72 73 65 74 3D 61 73 63 69 69 0D 0A 55 73 65 arset=ascii..Use 0090: 72 2D 41 67 65 6E 74 3A 20 4A 65 72 73 65 79 2F r-Agent: Jersey/ 00A0: 32 2E 32 31 20 28 48 74 74 70 55 72 6C 43 6F 6E 2.21 (HttpUrlCon 00B0: 6E 65 63 74 69 6F 6E 20 31 2E 38 2E 30 5F 34 35 nection 1.8.0_45 00C0: 29 0D 0A 48 6F 73 74 3A 20 -- -- -- -- -- -- -- )..Host: xxxxxxx 00D0: -- -- -- -- -- -- 3A 38 30 38 35 0D 0A 43 6F 6E xxxxxx:8085..Con 00E0: 74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 36 33 35 tent-Length: 635 ... pool-1-thread-1, WRITE: TLSv1.2 Application Data, length = 288 [Raw write]: length = 293 ...
然后我看到响应回来了:
... pool-1-thread-1, READ: TLSv1.2 Application Data, length = 160 Padded plaintext after DECRYPTION: len = 160 ... 0010: 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D HTTP/1.1 200 OK. 0020: 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 .Connection: kee 0030: 70 2D 61 6C 69 76 65 0D 0A 44 61 74 65 3A 20 46 p-alive..Date: F 0040: 72 69 2C 20 33 30 20 4F 63 74 20 32 30 31 35 20 ri, 30 Oct 2015 0050: 32 33 3A 33 37 3A 32 39 20 47 4D 54 0D 0A 43 6F 23:37:29 GMT..Co 0060: 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 30 0D ntent-length: 0... ... 2015/303 23:37:34.826: TRACE myapp.BaseHttpsConnector.doPostFile:236 - Sleeping... Keep-Alive-Timer, called close() Keep-Alive-Timer, called closeInternal(true) Keep-Alive-Timer, SEND TLSv1.2 ALERT: warning, description = close_notify Padded plaintext before ENCRYPTION: len = 64 ... Keep-Alive-Timer, WRITE: TLSv1.2 Alert, length = 64 [Raw write]: length = 69 ... Keep-Alive-Timer, called closeSocket(true) 2015/303 23:37:39.829: TRACE myapp.BaseHttpsConnector.doPostFile:236 - Sleeping... 2015/303 23:37:44.831: TRACE myapp.BaseHttpsConnector.doPostFile:236 - Sleeping... 2015/303 23:37:49.833: TRACE myapp.BaseHttpsConnector.doPostFile:236 - Sleeping... 2015/303 23:37:54.836: TRACE myapp.BaseHttpsConnector.doPostFile:236 - Sleeping... 2015/303 23:37:54.836: INFO myapp.BaseHttpsConnector.doPostFile:261 - POST of file {myfile.xml} succeeded: 200: OK
因此深埋在post()调用中,在我对Response对象做任何事情之前,有一个Keep-Alive-Timer在连接上异步调用close().POST和响应的标题中都设置了"Connection:keep-alive".我还在客户端中将系统属性http.keepAlive设置为true,即使这是默认值.如何保持连接不被关闭,以便当下一条消息需要在短时间内发布后,客户端可以重用连接?
非常感谢您的帮助!