Java中通过Socket发送HTTP/2请求

Fra*_*oni 0 java http2


我需要通过 TCP 套接字从我的 Java 类发送 HTTP/2 请求。我已经适配了一段适用于普通 HTTP/1.1 的代码。但是,使用 HTTP/2 时,它不会输出任何响应或错误代码。

你能看出其中有什么问题吗?我试图访问的服务器位于https://localhost:8443

Socket s = new Socket(InetAddress.getByName("localhost"), 8443);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.print("GET / HTTP/2.0\r\n");
pw.print("Host: localhost:8443\r\n\r\n");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String t;
while((t = br.readLine()) != null) System.out.println(t);
br.close();
Run Code Online (Sandbox Code Playgroud)

谢谢!

sbo*_*det 6

这是行不通的。

HTTP/2是二进制协议,而不是文本协议,因此为了使用原始套接字,您必须生成形成 HTTP/2 请求的正确字节。

这非常复杂,因为它要求您实现HPACK来压缩标头,因此您最好使用一个为您执行 HTTP/2 的 Java 库,并具有更高级别的 API(而不是使用原始套接字)。

[免责声明:我是 Jetty 中的 HTTP/2 实现者]

Jetty 提供了一个低级 HTTP/2 客户端,允许您处理 HTTP/2 帧,以及一个高级 HTTP 客户端,可以使用 HTTP/2 格式发送通用 HTTP 请求。

对于第一个,您可以在这里找到一个示例: https: //github.com/eclipse/jetty.project/blob/jetty-9.4.18.v20190429/jetty-alpn/jetty-alpn-java-client/src/test/ java/org/eclipse/jetty/alpn/java/client/JDK9HTTP2ClientTest.java

对于第二个,有文档的这一部分:https://www.eclipse.org/jetty/documentation/9.4.x/http-client-transport.html#_http_2_transport