当前位置: 首页 > 知识库问答 >
问题:

okHttp3保持活动连接不工作

越英范
2023-03-14

我使用okhttp3和retrofit2来获取json文件。我尝试了所有方法来使用keep-Alive连接来使数据下载更快,但似乎没有任何效果。

我已经实现了拦截器,并添加了keep-alive头。但它似乎就是不想工作。有人能看看我的代码,告诉我我在这里做错了什么吗?这是我的代码:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
ConnectionPool connectionPool = new ConnectionPool(3, 10, TimeUnit.MINUTES);
Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.connectionPool(connectionPool)
                .connectTimeout(15, TimeUnit.SECONDS)
                .readTimeout(15, TimeUnit.SECONDS);
        httpClient.interceptors().add(logging);
        httpClient.interceptors().add(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {
                Request original = chain.request();

                // Customize the request
                Request request = original.newBuilder()
                        .header("Connection", "Keep-Alive")
                        .method(original.method(), original.body())
                        .build();

                try {
                    Response response = chain.proceed(request);
                    if (!response.isSuccessful()) {
                            response.close();
                            connectionPool.evictAll();
                            Log.d("okokok", "evict");
                            return chain.proceed(request);
                        } else {
                            // Customize or return the response
                            Log.d("okokok", "return response");
                            return response;
                        }
                } catch (IOException e) {
                    e.printStackTrace();
                    connectionPool.evictAll();
                    return chain.proceed(request);
                }
            }
        });

        OkHttpClient client = httpClient.build();
        Retrofit retrofit = new Retrofit.Builder()

                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build();

        postService = retrofit.create(PostService.class);

我想在这里补充的一点是,我使用Glide从html" target="_blank">服务器加载图像,Glide似乎使用Keep-Alive设置安静很好,因为Glide加载图像非常有效,没有任何延迟。因此,下载速度慢的问题似乎只存在于okhttp3+改版中。

有人能调查一下,让我知道我在这里做错了什么吗?我已经在这个问题上工作了两个星期,但仍然没有找到解决办法。我阅读了与此问题相关的所有stackoverflow问题,但似乎没有任何问题。

共有1个答案

尹何平
2023-03-14

对,这段代码运行良好,我发现我的主机在keepAliveTimeout上有5秒的限制,这就是为什么KeepAlive在连接关闭后只能工作5秒。无论我做什么,除非我改变主机,否则代码都不能改变这一点。

 类似资料:
  • 我正在创建一个客户端服务器应用程序。服务器已经设计好,等待从客户端连接。现在在客户机部分中,我希望在应用程序的整个生命周期中保持连接活动,并且只有当主客户机应用程序关闭或关闭或者服务器关闭它时,连接才会关闭。 在处理程序中我有:

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 错误代码:2013。查询期间与MySQL服务器的连接中断 我正在使用MySQL工作台。另外,我正在运行一批插入,总共大约1000行(例如,乘以1000次),每批需要相当长的时间,其中一些时间超过600秒。 如何配置workbench,以便在不停止和不丢失连接的情况下继续通宵工作?

  • 在带有PoolingHttpClientConnectionManager的Apache HttpClient中,Keep-Alive策略是否会更改活动连接在从连接池中删除之前保持活动状态的时间量?还是只会关闭空闲连接? 例如,如果我将Keep Alive策略设置为每个请求返回5秒,并且我使用相同的连接每2秒点击一次URL/路由,那么Keep Alive策略是否会导致该连接离开池?或者它会留在池中

  • 我有一个Android应用程序,即时通讯是其中一个关键功能。为了实现IM特性,我们使用基于的推送服务器。 编辑:我曾建议使用前台服务,但下午不喜欢通知托盘总是显示在状态栏,他希望保持干净。 任何建议都将不胜感激!

  • 所以HTTP。1版本及以上版本支持持久性连接。 现在,我们正在创建一个Rest应用程序,它应该是无状态的。我们一次限制连接的数量。 但如果我仔细阅读HTTP1.0文档,这种方法似乎有问题。 它说服务器将保持连接打开,除非客户端说关闭。 所以,我的问题是如果客户端没有关闭怎么办?如果连接始终处于活动状态,它可能会给我拒绝服务错误。 什么是jetty的默认超时,我如何配置它?我无法找到合适的留档。