如何通过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
相关产品推荐
相关产品推荐

