Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取完整的HTTP请求头_Java_Sockets_Io_Http Headers - Fatal编程技术网

Java 读取完整的HTTP请求头

Java 读取完整的HTTP请求头,java,sockets,io,http-headers,Java,Sockets,Io,Http Headers,我目前正在创建一个小型Web服务器(用于测试目的),但在读取HTTP请求头(来自浏览器,在我的例子中是chromium)时遇到问题 首先,我只是尝试了这样的方法: BufferedReader in = new BufferedReader( new InputStreamReader(client_socket.getInputStream(), "UTF-8") ); StringBuilder builder = new StringBuilder(); while (in.ready

我目前正在创建一个小型Web服务器(用于测试目的),但在读取HTTP请求头(来自浏览器,在我的例子中是chromium)时遇到问题

首先,我只是尝试了这样的方法:

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
(我关闭了
客户端套接字以及所有读写器)

经过一番探索,我偶然发现了一个老问题:

我尝试了前四种解决方案(两种是Apache Commons,一种是使用
扫描仪,另一种是使用do while循环)。所有的网站都被屏蔽了,浏览器给了我一个“无法访问的网站”错误

我想自己做这件事(不使用任何库或嵌入式服务器),这就是我为什么要尝试的原因


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

你正在从套接字读取数据,直到没有更多的数据可读取为止。这是错误的。您需要一直读取,直到遇到长度为0的行,然后处理接收到的标题,以确定是否有更多数据要读取(查找
内容长度:…
传输编码:分块
标题),例如:


阅读更多细节。这不仅有助于正确读取请求,而且还允许您正确支持HTTP keep alives(用于在单个连接上发送多个请求)。

Remy Lebeau提出的上述解决方案是错误的,正如我的一个测试所示。此替代方案是故障安全的:

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

请参阅:

尽管您给定的代码被剪断后无法编译(
String
以大写开头),但固定版本可以正常工作。我还将检查参考RFC,谢谢。
StringBuilder builder = new StringBuilder(); 
String line;
do
{
    line = in.readLine(); 
    if (line.equals("")) break;
    builder.append(line);
}
while (true);