😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
什么是连接复用 🔗
连接复用
是指通过复用已经建立的TCP连接来发送发个多个HTTP请求,主要通过连接池(Connection Pool)来实现,连接池会维护一组已经建立的连接,并在需要发送新的请求时重用这些连接,而不是每次请求都重新建立一个新的连接。
需要注意以下两点:
- 针对同一个 OkhttpClient
- 发送多次请求,请求为同一个,比如说访问www.baidu.com,发送多次,只有在第一次的时候会建立连接,后续再次请求www.baidu.com,则会直接复用前一个已经建立的连接。
所以连接复用的好处可以总结为以下几点: - 性能提升:可以减少连接建立和关闭的开销,从而提高请求的响应速度和整体性能。
- 减少资源消耗:避免频繁地建立和关闭连接可以减少系统资源的消耗,尤其是在高并发的情况下能够有效减轻服务器的负担。
- 复用连接可以减少网络延迟,因为已经建立的连接可以直接发送新的请求,而无需重新进行TCP三次握手等操作。
在 OkHttp 中,默认情况下会使用连接池来实现连接复用,你可以通过配置连接池的大小和保持连接的时间等参数来调整连接复用的行为。通过连接复用,OkHttp 能够更高效地管理和利用网络连接,提升网络请求的效率和性能。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private OkHttpClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
client = new OkHttpClient.Builder()
.connectionPool(new ConnectionPool(5,5, TimeUnit.MINUTES))
.addInterceptor(new LoggingInterceptor())
.build();
// 发送多个请求以体现连接复用的效果
new Thread(() -> {
for (int i = 0;i<1000;i++) {
sendRequest("http://www.baidu.com");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}
private void sendRequest(String url) {
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e(TAG, "onResponse: "+ response.headers());
ResponseBody responseBody = response.body();
//String responseBodyString = source.readUtf8();
if(responseBody != null) {
BufferedSource source = response.body().source();
String responseBodyString = source.readUtf8();
Log.d(TAG, "Response for " + call.request().url() + ": " + responseBodyString);
// 处理完响应体后关闭响应体
responseBody.close();
call.cancel();
}else{
Log.e(TAG, "Response body is null");
call.cancel();
}
}
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "Request failed: " + e.getMessage());
}
});
}
}
我们将上述代码构建成的apk,安装在手机上,通过对Android app 进行抓包。
连接复用验证
我是通过 Charles
与 Wireshark
,相结合的方式,因为我电脑上单独使用Wireshark
工具的会并不会抓到包,所以采用两者结合的方式。
将手机和电脑处在同一个局域网中(可以再使用数据线连接)
首先开启 Charles,菜单栏:Help—>SSL Proxying—>Install Charles Root Certifi…,如何你是方式https,则需要安装证书。因为我们访问的是http,所以直接配置代理就行,配置当前本机 IP,和Charles设置的端口号,我的是8888。
接下来开始 Wireshark(手机需要连接电脑),然后在过滤器中过滤“http.host == www.baidu.com”,我们先让请求多发送几次,然后停止,我们在过滤下" tcp.port == 8888",我们会看到连接建立以及发送数据包的过程。我们会看到连接只建立了一次,后面全部都是发送数据包,直至连接断开。