我需要通过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();
谢谢!
答案 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://www.eclipse.org/jetty/documentation/9.4.x/http-client-transport.html#_http_2_transport