如何使用 Okttp Android 避免 SSL 握手

问题描述 投票:0回答:2

概述

我正在使用以下版本的 Okhttp com.squareup.okhttp3:okhttp:4.9.3

当一笔事务发生时,我需要一次性执行多个 HttpRequest。

我采用了 Singleton OkHttpClient 来避免每次创建新客户端,因此我为所有 http 请求重用相同的 http 客户端

场景

当我使用同一个 Singleton OkHttpClient 并行执行多个 http 请求时,第一个 http 请求会发生 SSL 握手,而其他 http 请求不会发生 SSL 握手。

问题陈述

如果 2 个 http 请求之间的延迟超过 30 秒,则每次都会发生 SSL 握手..我想解决这个问题。 SSL 握手应该仅在第一个 http 请求时发生。我现在可能会发送一个http请求,然后需要一些时间,然后发送另一个http请求。我不希望第二个 httprequest 发生 SSL 握手。现在,如果延迟 30 秒,就会发生这种情况。如果我执行多个 http 请求而没有任何时间延迟,那么它工作正常。

OkttpClient 中是否有任何设置可以增加 2 个 http 请求之间的空闲时间,以便每次都不会发生 SSL 握手。

android okhttp ssl-handshake
2个回答
0
投票

您可以影响连接的空闲时间,从而间接影响 TLS 握手超时。您可以通过配置连接池的驱逐策略和保持活动持续时间来完成此操作。

// Increase the idle connection timeout to 10 minutes
ConnectionPool connectionPool = new ConnectionPool(
    /* maxIdleConnections */ 5,
    /* keepAliveDuration */ 10, TimeUnit.MINUTES
);

OkHttpClient client = new OkHttpClient.Builder()
    .connectionPool(connectionPool)
    .build();

在上面的代码中,

keepAliveDuration
构造函数中的
ConnectionPool
参数指定连接在考虑驱逐和清理之前可以保持空闲状态的时间。通过增加此值,您可以间接影响 TLS 握手的超时。

希望有帮助!


0
投票

尝试 keepAliveDuration 例如:

import okhttp3.OkHttpClient;

public class MyHttpClient {
    private static OkHttpClient client;

    public static OkHttpClient getClient() {
        if (client == null) {
            client = new OkHttpClient.Builder()
                .keepAliveDuration(60, TimeUnit.SECONDS) 
                .build();
        }
        return client;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.