httpclient长链接与短链接
来源:互联网 发布:手机淘宝店铺主图尺寸 编辑:程序博客网 时间:2024/04/28 17:46
http keep-alive与tcp keep-alive
http keep-alive与tcp keep-alive,不是同一回事,意图不一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:
1
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
2
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
3
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。
在httpclient中,创建连接并获得请求结果后,会对改连接设置长连接策略,如在MinimalClientExec.java类中,
httpProcessor.process(request, context); final HttpResponse response = requestExecutor.execute(request, managedConn, context); httpProcessor.process(response, context); // The connection is in or can be brought to a re-usable state. if (reuseStrategy.keepAlive(response, context)) { // Set the idle duration of this connection final long duration = keepAliveStrategy.getKeepAliveDuration(response, context); releaseTrigger.setValidFor(duration, TimeUnit.MILLISECONDS); releaseTrigger.markReusable(); } else { releaseTrigger.markNonReusable(); }
在看看默认的长连接设置策略
public class DefaultConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy { public static final DefaultConnectionKeepAliveStrategy INSTANCE = new DefaultConnectionKeepAliveStrategy(); public long getKeepAliveDuration(final HttpResponse response, final HttpContext context) { Args.notNull(response, "HTTP response"); final HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { final HeaderElement he = it.nextElement(); final String param = he.getName(); final String value = he.getValue(); if (value != null && param.equalsIgnoreCase("timeout")) { try { return Long.parseLong(value) * 1000; } catch(final NumberFormatException ignore) { } } } return -1; }}
当然也可以自己来时间长连接策略,比如下面的这个
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() { public long getKeepAliveDuration(HttpResponse response, HttpContext context) { // Honor 'keep-alive' header HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { HeaderElement he = it.nextElement(); String param = he.getName(); String value = he.getValue(); if (value != null && param.equalsIgnoreCase("timeout")) { try { return Long.parseLong(value) * 1000; } catch(NumberFormatException ignore) { } } } HttpHost target = (HttpHost) context.getAttribute( HttpClientContext.HTTP_TARGET_HOST); if ("www.baidu.com".equalsIgnoreCase(target.getHostName())) { // Keep alive for 5 seconds only return 5 * 1000; } else { // otherwise keep alive for 30 seconds return 30 * 1000; } }};CloseableHttpClient client = HttpClients.custom() .setKeepAliveStrategy(myStrategy) .build();
0 0
- httpclient长链接与短链接
- 长链接/短链接
- 长链接转短链接
- 长链接转短链接
- TCP长链接/短链接
- 长链接和短链接
- 长链接转短链接
- Java socket 长连接与短链接
- HTTP长连接与短链接
- SOCKET的短链接与长连接
- HTTP长链接与短连接
- socket长链接与短连接
- ios 长链接与短链接之间的转换
- http长链接和短链接
- 网络编程长链接和短链接
- URL长链接转换为短链接
- 长链接转换为短链接
- 将一条长链接转成短链接。
- HDU2087 剪花布条
- 001潜入大数据Hadoop框架的世界
- ksweb.a.java
- SurfaceView的那点事儿
- (LeetCode 15) 3Sum
- httpclient长链接与短链接
- NSBundle简介
- POJ 1995 Raising Modulo Numbers(快速幂取模)
- 《CLR via C#:框架设计》读书笔记 - 委托
- 蓝桥杯(Java) 入门训练 Fibonacci数列
- elasticsearch的java搜索语法
- Unity Shaders and Effects Cookbook (4-3)遮罩反射
- elasticsearch JAVA客户端操作---搜索的过滤、分组高亮,elasticsearchjava
- 数学建模中的整数规划总结及姜启源第4章(1-3)的解析