【问题标题】:Detect end of http get request header (java)检测http get请求头的结束(java)
【发布时间】:2016-06-20 17:12:27
【问题描述】:

我正在尝试用 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 = "";
            }
        }

我找到了detecting end of http header with \r\n\r\n,根据那里的答案,我应该能够以这种方式检测到标头的结尾,但是当我搜索从浏览器发出的请求时,它找不到这个“ \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

任何帮助表示赞赏

编辑:这是类的,所以我们不能使用java自带的内置http库。

【问题讨论】:

    标签: java http


    【解决方案1】:

    我个人会使用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;
        }
    }
    

    【讨论】:

    • 非常感谢您的帮助
    【解决方案2】:

    使用 BufferedReader.readLine()。当你得到一个空行时,你就完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 2012-10-21
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2019-05-16
      相关资源
      最近更新 更多