如何通过Java

时间:2017-02-14 08:48:13

标签: 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!

问题是如何获得完整的Http请求,包括邮件正文。 我试着这样写。

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();
}

控制台永远不会打印"完成"然后我改变了这个

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();
}
事情变得更好,我们可以看到"完成"!但是,如果我更快地刷新页面。缓冲区读取器将不会准备就绪并且不会进入{}!

我想打印所有重新请求并且"完成"

请帮帮我。 非常感谢!!

1 个答案:

答案 0 :(得分:0)

你的方法都不正确。

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

在第二个中,你有计时问题。 input.ready()检查接收缓冲区是否包含任何内容,而不是检查请求是否已结束。因此,您可能最终只打印请求的一部分而不是等待整个事情。使用这种方法和正确的时间,您可能最终打印请求的一部分,多个请求或其间的任何内容(如请求和一半)。

另请注意,HTTP GET消息this MSDN documntation,并且没有浏览器会像您的示例中那样请求。