通过Java中的套接字发送HTTP / 2请求

时间:2019-05-07 09:54:48

标签: java http2


我需要通过Java类中的TCP套接字发送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();

谢谢!

1 个答案:

答案 0 :(得分:4)

那行不通。

HTTP/2是二进制协议,而不是文本协议,因此,要使用原始套接字,必须生成构成HTTP / 2请求的适当字节。

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

[免责声明:我是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