2012-01-13 167 views
-1

我目前正在创建一个小型web服务器(用于测试目的),并且在阅读HTTP请求标头(来自浏览器,我的情况为铬)时出现问题。阅读完整的HTTP请求标题

首先,我只是尝试了这样的事情:

BufferedReader in = new BufferedReader(
    new InputStreamReader(client_socket.getInputStream(), "UTF-8") 
); 
StringBuilder builder = new StringBuilder(); 
while (in.ready()){ 
    builder.append(in.readLine()); 
} 
return builder.toString(); 

这第一个请求的罚款。但是,第一个请求完成后,ready()-方法仅返回false(我关闭了以及所有读者/作者)。

一点点搜索我碰到这个问题,年长后跌跌撞撞:Read/convert an InputStream to a String

我尝试的第一个四种解决方案(两次与Apache的风景,一个与Scanner和一个用do-while循环)。他们都被永远封锁,浏览器给了我一个“网站无法访问” - 错误。

我想自己做这件事(不使用任何图书馆或嵌入式服务器),这就是为什么我甚至尝试。

我现在有点迷路了,你会怎么做呢?

回答

1

您正在读取套接字,直到没有更多数据可读。那是错的。你必须保持阅读,直到你遇到一个长度为0线,然后处理接收到的报头,以确定是否有更多的数据读取(寻找Content-Length: ...Transfer-Encoding: chunked头),例如:

StringBuilder builder = new StringBuilder(); 
String line; 
do 
{ 
    line = in.readLine(); 
    if (line == "") break; 
    builder.append(line); 
} 
while (true); 
// use builder as needed... 
// read message body data if headers say there 
// is a body to read, per RFC 2616 Section 4.4... 

阅读RFC 2616 Section 4更多细节。这不仅可以促进正确的请求读取,还可以正确支持HTTP保持活动(用于在单个连接上发送多个请求)。

+0

虽然你给的代码剪断不会编译('String'开始大写),固定版本的工作正常。我也会检查引用的RFC,谢谢你。 – 2012-01-13 21:52:56

1

上面Remy Lebeau提出的解决方案是错误的,正如它在我的测试中显示的那样。这种替代是故障 - 安全:

StringBuilder builder = new StringBuilder(); 
String line; 
do 
{ 
    line = in.readLine(); 
    if (line.equals("")) break; 
    builder.append(line); 
} 
while (true); 

参考:How do I compare strings in Java?