OkHttp如何实现连接复用,以及如何验证连接复用,本篇文章告诉你答案

😄作者简介: 小曾同学.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 进行抓包。

连接复用验证

我是通过 CharlesWireshark ,相结合的方式,因为我电脑上单独使用Wireshark工具的会并不会抓到包,所以采用两者结合的方式。
将手机和电脑处在同一个局域网中(可以再使用数据线连接)
首先开启 Charles,菜单栏:Help—>SSL Proxying—>Install Charles Root Certifi…,如何你是方式https,则需要安装证书。因为我们访问的是http,所以直接配置代理就行,配置当前本机 IP,和Charles设置的端口号,我的是8888。
在这里插入图片描述
接下来开始 Wireshark(手机需要连接电脑),然后在过滤器中过滤“http.host == www.baidu.com”,我们先让请求多发送几次,然后停止,我们在过滤下" tcp.port == 8888",我们会看到连接建立以及发送数据包的过程。我们会看到连接只建立了一次,后面全部都是发送数据包,直至连接断开。

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值