Java 读取完整的HTTP请求头
我目前正在创建一个小型Web服务器(用于测试目的),但在读取HTTP请求头(来自浏览器,在我的例子中是chromium)时遇到问题 首先,我只是尝试了这样的方法: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
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);