OkHttpClient出现移动运营商问题 主要问题: Vodafone Idea运营商使用App =非常慢更新案例研究:

问题描述

我的应用程序API执行奇怪的行为。我的实时应用程序的api之一预期响应时间为2到3秒,但是响应时间很长!

测试用例:

  1. 可以使用WIFI =
  2. 与Airtel运营商一起使用=
  3. 与Jio运营商一起使用=
  4. 在其他国家/地区的作品网络=
  5. 在移动浏览器中使用Vodafone Idea载体=
  6. 使用Vodafone Idea载体与IOS应用程序的Same API配合使用=

主要问题: Vodafone Idea运营商使用App =非常慢

案例1。

 URL url = new URL("https://example.com");
                urlConnection = (HttpsURLConnection) url.openConnection();
                urlConnection.setReadTimeout(10000);
                urlConnection.setConnectTimeout(10000);
                int code = urlConnection.getResponseCode();
                if (code !=  200) {
                    throw new IOException("Invalid response from server: " + code);
                }

                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        urlConnection.getInputStream()));
                String line;
                while ((line = rd.readLine()) != null) {
                    Log.e("data",line);
                }

结果:

  • 第一次40到50秒。
  • 在下一个连续的呼叫中,它将按预期在2到5秒内返回。

案例2:

OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

        Request.Builder requestBuilder = new Request.Builder()
                .url("https://example.com")
                .addHeader("Content-Type","application/json");
        Request request = requestBuilder.build();
        Log.e("APi","REQUEST: "+request.toString());

        Call call1 = okHttpClient.newCall(request);
        call1.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call,@NotNull IOException e) {
                Log.e("APi","APi Failed");
            }

            @Override
            public void onResponse(@NotNull Call call,@NotNull Response response) throws IOException {
                Log.e("APi","APi isSuccessful:" + response.isSuccessful());
                Log.e("APi","Response:" + response.body().string());
            }
        });

结果:

  • 每次花费40到50秒。

案例3:

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1,TimeUnit.SECONDS).build();
    
            Request.Builder requestBuilder = new Request.Builder()
                    .url("https://example.com")
                    .addHeader("Content-Type","application/json");
            Request request = requestBuilder.build();
            Log.e("APi","REQUEST: "+request.toString());
    
            Call call1 = okHttpClient.newCall(request);
            call1.enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call,@NotNull IOException e) {
                    Log.e("APi","APi Failed");
                }
    
                @Override
                public void onResponse(@NotNull Call call,@NotNull Response response) throws IOException {
                    Log.e("APi","APi isSuccessful:" + response.isSuccessful());
                    Log.e("APi","Response:" + response.body().string());
                }
            });

结果:

  • 每次都需要5到6秒。

注意:恐怕在应用程序中将.connectTimeout(1,TimeUnit.SECONDS)用作1秒,它开始出现更多api错误,并且看起来也不是正确的解决方案。

更新案例研究:

https://github.com/square/okhttp OkHttpClient的详细调试。 它给出以下误差约4倍。
Failed to connect to xxx.com/2001:4860:4802:36::15 (port XXX) from /2402:3a80:1b8f:ca21:847:21a8:5ffc:fc30 (port XXX) after 10000ms  

包okhttp3.internal.connection.RealConnection类。 尝试建立 connectSocket ,但出现错误

->将“ www” www.example.com添加到我的域中之后。 okhttp库的响应时间从40秒更改为大约12秒。

解决方法

很难看到整个图片,因为您没有解释如何执行后续连接。您完全有可能重用现有的连接。默认情况下,HTTP / 1.1使连接保持活动状态。

检查是否使用纯文本HTTP与HTTPS是否有所不同也可能很有趣,因为HTTPS的连接设置成本较高。您的客户可能还会根据返回的证书进行更多的验证。

如果更改主机名有很大不同,那么我肯定会研究系统上名称解析器的配置方式

我还将捕获网络流量,并查看需要花费多长时间。 tcpdump是您的 朋友,或者您可以随时考虑使用wireshark

正如其他人所建议的那样,您可能还想禁用框中的IPv6堆栈,以排除是造成问题的根源。