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

时间:2016-06-20 17:12:28

标签: java http

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

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

  1. 将请求读入缓冲区字符串
  2. 处理请求
  3. 转到1请求新请求
  4. 根据我的理解,所有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库。

2 个答案:

答案 0 :(得分:4)

我会亲自使用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; } } 逐行读取,直到我到达一个空行指示标题的结尾,它更不容易出错。

<div style="overflow:auto; -webkit-overflow-scrolling:touch; width:360px; height:600px;">
    <iframe src='url' width='360' height='600'></iframe>
</div>

答案 1 :(得分:2)

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

相关问题