You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OkHttp 5.0.0-alpha.10获取HTTP/2连接的服务器初始设置

获取OkHttp 5.0.0-alpha.10中HTTP/2服务器初始设置的方法

你当前手动创建Http2Connection的方式无法获取到服务器的初始设置,因为缺少完整的HTTP/2握手流程(包括ALPN协议协商、客户端SETTINGS帧发送、服务器SETTINGS帧接收解析等步骤)。以下是两种可行的实现方式:

方式一:通过OkHttp请求自动完成握手后获取

这种方式更简单,利用OkHttpClient的请求流程自动完成HTTP/2握手,之后从已建立的连接中提取服务器设置:

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

Request request = new Request.Builder()
    .url("https://app.test.com")
    .build();

try (Response response = client.newCall(request).execute()) {
    // 强转为RealConnection,获取Http2Connection实例
    RealConnection realConnection = (RealConnection) response.connection();
    Http2Connection http2Connection = (Http2Connection) realConnection.http2Connection();
    
    // 从peerSettings()中提取服务器发送的初始设置
    int initialWindowSize = http2Connection.peerSettings().getInitialWindowSize();
    int maxConcurrentStreams = http2Connection.peerSettings().getMaxConcurrentStreams();
    
    System.out.println("初始窗口大小: " + initialWindowSize);
    System.out.println("最大并发流数: " + maxConcurrentStreams);
} catch (IOException e) {
    e.printStackTrace();
}

方式二:手动处理HTTP/2握手并监听SETTINGS帧

如果必须手动创建Socket和连接,可以通过设置Http2Connection.Listener来监听服务器发送的SETTINGS帧:

OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
SSLSocketFactory factory = okHttpClient.sslSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket("app.test.com", 443);

// 先验证ALPN协商结果,确保服务器使用HTTP/2协议
String selectedProtocol = socket.getApplicationProtocol();
if (!"h2".equals(selectedProtocol)) {
    throw new IOException("服务器不支持HTTP/2协议");
}

// 定义监听器接收服务器SETTINGS帧
Http2Connection.Listener settingsListener = new Http2Connection.Listener() {
    @Override
    public void onSettings(Http2Connection connection, Settings peerSettings) {
        // 提取所需的初始设置参数
        int initialWindowSize = peerSettings.getInitialWindowSize();
        int maxConcurrentStreams = peerSettings.getMaxConcurrentStreams();
        
        System.out.println("初始窗口大小: " + initialWindowSize);
        System.out.println("最大并发流数: " + maxConcurrentStreams);
    }
};

// 创建并配置Http2Connection
Http2Connection connection = new Http2Connection.Builder(true, TaskRunner.INSTANCE)
    .socket(socket)
    .listener(settingsListener)
    .build();

// 发送客户端默认SETTINGS帧,完成握手第一步
connection.settings(Settings.DEFAULT);
connection.start();

// 等待异步接收服务器帧(实际场景中需用更可靠的等待逻辑)
Thread.sleep(5000);

关键说明

  • peerSettings()方法返回的是服务器发送的所有初始设置,只有在完成HTTP/2握手后才会包含有效数据。
  • 手动方式需要自行处理ALPN协商、帧的发送接收逻辑,适合自定义场景,一般推荐使用第一种方式。

内容的提问来源于stack exchange,提问作者himanshu_mps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:48:27