问题描述
我的应用程序API执行奇怪的行为。我的实时应用程序的api之一预期响应时间为2到3秒,但是响应时间很长!
测试用例:
- 可以使用WIFI = 是
- 与Airtel运营商一起使用= 是
- 与Jio运营商一起使用= 是
- 在其他国家/地区的作品网络= 是
- 在移动浏览器中使用Vodafone Idea载体= 是
- 使用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堆栈,以排除是造成问题的根源。