在读取HTTP请求标头

时间:2016-05-12 20:26:13

标签: java

我想编写一个简单的HTTP服务器,只是为了练习,我已经20行并且已经卡住了。

package httpd;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Httpd {

    public static void main(String[] args) {
        try (
                ServerSocket server = new ServerSocket(1500);
                Socket sock = server.accept();
                InputStream in = sock.getInputStream();) {

            int b;
            while ((b = in.read()) != -1) {
                System.out.write(b);
            }

            System.out.println("Sending HTTP Response");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这很好,标题会写入我控制台中的out流:

GET / HTTP/1.1
Host: 127.0.0.1:1500
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

那就是它。它只是坐在那里。它从不打印Sending HTTP Response而只是坐在那里。谷歌Chrome正在向后旋转,等待回应。它们一直挂起,直到我在Google Chrome中杀死该页面,然后服务器打印Sending HTTP Response

除非while循环被破坏,否则我无法响应,并且由于某种原因它不会中断。为什么呢?

编辑:

package httpd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Httpd {

    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(1500);
            Socket sock = server.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));

            int b;
            while ((b = in.read()) != -1) {
                System.out.write(b);
            }

            System.out.println("Sending HTTP Response");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这很有效。我不明白为什么。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

我认为正在发生的事情是TCP连接仍处于打开状态(因为客户端正在等待响应),因此输入流未结束,因此read()阻塞而不是返回-1。我猜测BufferedReader的逻辑由于某种原因是不同的。

阅读本文,了解如何检测请求的结束:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4

如果您只是处理GET,那么您可以只查找\n\n,但处理POST将需要更复杂的内容。