Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java获得完整的Http请求_Java_Sockets_Http_Network Programming - Fatal编程技术网

如何通过Java获得完整的Http请求

如何通过Java获得完整的Http请求,java,sockets,http,network-programming,Java,Sockets,Http,Network Programming,我试图使用套接字编写一个httpserver,但遇到了这个问题。 众所周知,Http请求是这样的 GET /index.html HTTP/1.1 Cache-Control: max-age=0 Host: 127.0.0.1 Accept:xxxxx User-Agent: xxxx Connection: keep-alive CRLF This is message body! ServerSocket serverSocket = new ServerSocket(8000); wh

我试图使用套接字编写一个httpserver,但遇到了这个问题。 众所周知,Http请求是这样的

GET /index.html HTTP/1.1
Cache-Control: max-age=0
Host: 127.0.0.1
Accept:xxxxx
User-Agent: xxxx
Connection: keep-alive
CRLF
This is message body!
ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
 Socket socket = serverSocket.accept();
 new Thread() {
  {
   InputStream is = socket.getInputStream();
   BufferedReader input = new BufferedReader(new InputStreamReader(is));
   String line = null;
   while ((line = input.readLine()) != null) {
    System.out.println(line);
   }
   System.out.print("finish");
  }
 }.start();
}
问题是如何获得完整的Http请求,包括消息体。 我试着这样写

GET /index.html HTTP/1.1
Cache-Control: max-age=0
Host: 127.0.0.1
Accept:xxxxx
User-Agent: xxxx
Connection: keep-alive
CRLF
This is message body!
ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
 Socket socket = serverSocket.accept();
 new Thread() {
  {
   InputStream is = socket.getInputStream();
   BufferedReader input = new BufferedReader(new InputStreamReader(is));
   String line = null;
   while ((line = input.readLine()) != null) {
    System.out.println(line);
   }
   System.out.print("finish");
  }
 }.start();
}
控制台永远不会打印“finish”,然后我就这样改变了

ServerSocket serverSocket = new ServerSocket(8000);
while (true) {
 Socket socket = serverSocket.accept();
 new Thread() {
  {
   InputStream is = socket.getInputStream();
   BufferedReader input = new BufferedReader(new InputStreamReader(is));
   String line = null;
   while (input.ready()) {
    line = input.readLine();
    System.out.println(line);
   }
   System.out.println("finish");
  }
 }.start();
}
事情会好起来的,我们可以看到“结束”!但是如果我刷新页面快一点的话,bufferdreader就不会准备好了,而且不会进入while{}

我想打印所有重新请求和“完成”

请帮帮我。
非常感谢

你的两种方法都不正确

在第一种情况下,
input.readLine()
仅在流结束时返回
null
,而在请求结束时返回。这意味着只要浏览器保持TCP连接打开,就可以在那里循环。那可能需要一段时间。另外,可能会在同一个连接上发送多个请求,因此您可能最终会打印所有请求(我不知道您是否希望这样做)

在第二个例子中,你有时间问题
input.ready()
检查接收缓冲区是否有任何要读取的内容,而不是检查请求是否结束。因此,您可能最终只打印请求的一部分,而不是等待整个过程。使用这种方法和正确的计时,您可能会打印一个请求的一部分、多个请求或介于两者之间的任何内容(例如一个请求和一个半请求)


还请注意,HTTP获取消息,没有浏览器会像您的示例中那样发送请求。

只有当客户端关闭连接时,流才会结束。由于请求是为了保持连接处于活动状态,它不会这样做,因为它希望在同一个连接上发送下一个请求。您应该根据长度头编写循环(请记住,大多数GET请求不发送请求体!)“httpserver抛出套接字”没有意义。不清楚你在问什么。@EJP他的意思是“通过”@Maltn也许是这样,也许不是。由他来澄清。猜测只是浪费时间。对不起,谢谢大家@lxhsb您需要非常了解RFC2616和朋友才能实现HTTP,特别是关于内容长度和传输编码的部分。猜测是不够的。请一直读到CRLF。那会给你头球。如果需要有效负载,则需要解析标头并计算出有多少有效负载。@Malt因此,如果请求具有消息体,则它将具有与响应类似的“内容长度”?是否正确?要么如此,要么请求可以是。正如EJP所建议的,您应该阅读有关您试图实现的协议的内容。。。