检测http get请求标头的结尾(java)

X.M*_*Mas 3 java http

我正在尝试用Java创建一个非常基本的HTTP服务器,它所要做的就是处理GET请求并适当地回复。

我正在尝试做这样的事情:

  1. 将请求读入缓冲区字符串
  2. 处理要求
  3. 转到1发出新请求

据我了解,所有HTTP GET请求标头均以“ \ r \ n \ r \ n”结尾,因此我认为我可以简单地在字符串中搜索此字符组合,如果找到它,则应表示完整的请求标头已经发送。我正在使用下面的代码尝试执行此操作,但是不幸的是,我似乎找不到上述组合。我是否以为应该找到这种结合是错误的?

        int bytesRead = 0;
        String request = "";
        DataInputStream in = new DataInputStream(clientSocket.getInputStream());
        DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
        while ((bytesRead = in.read(buffer)) != -1){
            request += new String(buffer).trim();
            buffer = new byte[BUFSIZE];
            if (request.contains("\r\n\r\n")) {
                handleRequest(request);
                request = "";
            }
        }
Run Code Online (Sandbox Code Playgroud)

我发现使用\ r \ n \ r \ n检测到HTTP标头的结尾,并且根据那里的答案,我应该能够以这种方式检测标头的结尾,但是当我搜索浏览器发出的请求时,找不到“ \ r \ n \ r \ n”组合。以下是Chrome发出的请求:

GET / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML,              like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept:    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4 
X-CookiesOK: I explicitly accept all cookies
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

编辑:这是为类,所以我们不允许使用Java附带的内置http库。

Nic*_*tto 5

我个人会BufferedReader逐行读取,直到到达指示标头结尾的空行为止,这更容易出错。

BufferedReader in = new BufferedReader(
    new InputStreamReader(clientSocket.getInputStream(), encoding)
);
String line;
StringBuilder request = new StringBuilder();
while ((line = in.readLine()) != null){
    request.append(line).append("\r\n");
    if (line.isEmpty()) {
        handleRequest(request.toString());
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)