如何保持HttpClient的连接保持?(How to keep HttpClient Connec

2019-07-04 10:24发布

我工作HttpClient POST方法。 我需要创建HttpClient一次,应该使用保持活动连接。 但我认为,在我的情况下,它的建立每当一个新的连接。

所以,我需要使用保持活动连接HttpClient

这里是我的代码片段任何帮助,将不胜感激很多。

ClientConnectionManager mgr = httpclient_recv.getConnectionManager();
    hp = httpclient_recv.getParams();
    httpclient_recv = new DefaultHttpClient(
    new ThreadSafeClientConnManager(hp,mgr.getSchemeRegistry()), hp);

    while (true) {

        try {

            java.util.logging.Logger.getLogger("org.apache.http.wire")
                    .setLevel(java.util.logging.Level.FINER);
            java.util.logging.Logger.getLogger("org.apache.http.headers")
                    .setLevel(java.util.logging.Level.FINER);

            System.setProperty("org.apache.commons.logging.Log",
                    "org.apache.commons.logging.impl.SimpleLog");
            System.setProperty(
                    "org.apache.commons.logging.simplelog.showdatetime",
                    "true");
            System.setProperty(
                    "org.apache.commons.logging.simplelog.log.httpclient.wire",
                    "debug");
            System.setProperty(
                    "org.apache.commons.logging.simplelog.log.org.apache.http",
                    "debug");
            System.setProperty(
                    "org.apache.commons.logging.simplelog.log.org.apache.http.headers",
                    "debug");

            ByteArrayEntity bae = new ByteArrayEntity(byteData);
            bae.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                    "binary/octet-stream"));

            httppost_recv.setHeader(HTTP.CONN_DIRECTIVE,HTTP.CONN_KEEP_ALIVE);
            httppost_recv.setEntity(bae);



            {
                System.out.println("res b4 response");
                 response_recv = httpclient_recv
                        .execute(httppost_recv);
                 response_recv.getEntity().consumeContent();
                System.out.println("res a4 response");
                if (response_recv != null) {
                    byteArray = EntityUtils.toByteArray(response_recv
                            .getEntity());
                    playing  = true;
                }
                        }
                 }

也logcat的日志是:

12-03 10:07:29.466: I/System.out(1529): res b4 response
12-03 10:07:29.646: D/org.apache.http.wire(1529): >> "POST /ping HTTP/1.1[EOL]"
12-03 10:07:29.666: D/org.apache.http.wire(1529): >> "Connection: Keep-Alive[EOL]"
12-03 10:07:29.686: D/org.apache.http.wire(1529): >> "Content-Length: 1[EOL]"
12-03 10:07:29.705: D/org.apache.http.wire(1529): >> "Content-Type: binary/octet-stream[EOL]"
12-03 10:07:29.716: D/org.apache.http.wire(1529): >> "Host: 192.168.1.36[EOL]"
12-03 10:07:29.725: D/org.apache.http.wire(1529): >> "User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)[EOL]"
12-03 10:07:29.736: D/org.apache.http.wire(1529): >> "[EOL]"
12-03 10:07:29.746: D/org.apache.http.headers(1529): >> POST /ping HTTP/1.1
12-03 10:07:29.746: D/org.apache.http.headers(1529): >> Connection: Keep-Alive
12-03 10:07:29.756: D/org.apache.http.headers(1529): >> Content-Length: 1
12-03 10:07:29.756: D/org.apache.http.headers(1529): >> Content-Type: binary/octet-stream
12-03 10:07:29.765: D/org.apache.http.headers(1529): >> Host: 192.168.1.36
12-03 10:07:29.765: D/org.apache.http.headers(1529): >> User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
12-03 10:07:29.776: D/org.apache.http.wire(1529): >> "[0x0]"
12-03 10:07:29.796: D/org.apache.http.wire(1529): << "HTTP/1.1 200 OK[EOL]"
12-03 10:07:29.805: D/org.apache.http.wire(1529): << "Server: gSOAP/2.8[EOL]"
12-03 10:07:29.816: D/org.apache.http.wire(1529): << "Content-Type: binary/octet-stream[EOL]"
12-03 10:07:29.826: D/org.apache.http.wire(1529): << "Content-Length: 2048[EOL]"
12-03 10:07:29.836: D/org.apache.http.wire(1529): << **"Connection: close[EOL]"**
12-03 10:07:29.887: D/org.apache.http.headers(1529): << HTTP/1.1 200 OK
12-03 10:07:29.896: D/org.apache.http.headers(1529): << Server: gSOAP/2.8
12-03 10:07:29.896: D/org.apache.http.headers(1529): << Content-Type: binary/octet-stream
12-03 10:07:29.906: D/org.apache.http.headers(1529): << Content-Length: 2048
12-03 10:07:29.906: D/org.apache.http.headers(1529): << **Connection: close**
12-03 10:07:29.916: I/System.out(1529): res a4 response

Answer 1:

10:07:29.746:d / org.apache.http.headers(1529):>>连接:保持活动

您正在请求存活。

10:07:29.836:d / org.apache.http.wire(1529):<< “连接:关闭[EOL]”

服务器拒绝它。

你没有什么可以做的,在你结束。



Answer 2:

从HTTP 1.1,保持活动默认情况下启用。 您将需要关闭连接,如果你不想与HTTP 1.1打交道时,它被明确地重用你。

对于1.0,一个标题是你为这个设置是什么“连接:保持活着”这只是暗示,就是要重用连接的服务器。 当受到压力或其他原因,服务器可能会选择如下所述采取不同的行动。

在大多数情况下这里的大多数的答案是正确的,在那里你加保活头和它工作得很好。 下面的解释是,你这样做的情况下,但它仍然无法正常工作。


服务器端的问题

正常情况下,答案将集中在准备时,服务器会表现得正常,但是这并不完全正确。 服务器(如陀罗 )在建造时,有不同的表现情况。 保活自带的一些请求的服务器将成为你们放弃你的连接之前,这是有允许为他人服务,以及因此在高负荷的情况下,有些服务器可能采取减少不保活请求为每种新的连接。

还有一个从收到的最后一个请求,这将最终导致断线,如果没有进一步的请求在该时间窗口中进行设置超时。 很少有现代服务器会根据他们目前所面对的或在恐慌情况进行保活无意义它下降到0的能力改变这一点。 所以,如果你的服务器正试图与通过它的任何可能选择放弃您的要求等(种族,恐慌)的条件去连接。


客户端的问题

对于文档的目的。 从hc.apache.org :

HttpClient的总是这样尽量重用连接。 持续连接是默认启用的,不需要配置。 在某些情况下,这可能会导致泄漏的连接,并因此失去了资源。 以禁用连接持久性的最简单的方法是提供或延伸的连接管理器,力关闭时在releaseConnection方法释放的连接。

HttpClient的提供这些(阅读:简单)的东西开箱。 但仍然有一些由阿帕奇提供的其他东西,你可以添加,以提高它的性能。

的ConnectionManager(一个或多个)例如可为用户定制的HttpClient。

因此,可以阻止保活的东西/连接持久性是,你可能要使用的连接管理器(这不是你的情况属实,但它可能会在其他几起案件是真实的)。 如果你得到了客户端对象建立一些API的调用,这可能是一个完全未知/抽象其实你。 这是如何可定制的例子进行了下面列出(从Apache的连接管理文档)

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);

CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .build();

(请参考Apache文档上的连接管理有详细介绍)

如果你面对这个问题,尝试没有CM或创建自己的HttpClient对象。 这是没有必要使用多个连接的CM为好。 内置的CM是不够公平。 如果您看到的性能损失,你可以编写自己的连接管理器。

在你的情况然而,你的服务器是不是很支持它可能无法兑现保活可言,即使你有这些头,什么不能。 您需要检查响应超时头,对发送保活在一个新的请求到服务器,以建立该服务器的投诉。



Answer 3:

你为什么不只是使用的所有请求相同的客户端???

我一直在工作,需要大量的数据的要求很多Web服务应用程序,为此,我只用一个静态的客户端和完美的作品!

我做了一个返回的HttpClient和管理我的所有请求(POST和GET)另一个类,美观大方,方便类;)



文章来源: How to keep HttpClient Connection Keep-Alive?