我正在试图找出为什么我的BufferedReader(从InputStream中读取)只是挂起而在收到空行后才读取。
尝试读取类似于:
的POST请求POST /test.php HTTP/1.0
Content-Length: 30
Content-Type: text/html;
postData=whatever&moreData...
我知道发布数据正在正确发送(采用上述格式),但是我无法检索发布的数据。我希望以下代码打印出帖子数据,然后等待更多...但是,实际发生的是它在“内容类型”行之后挂起。
while (true) {
System.out.println(bufferedReader.readLine());
}
用于获取流的代码:
bufferedReader = new BufferedReader(clientSocket.getInputStream());
有谁知道为什么会这样?
谢谢
答案 0 :(得分:4)
POST
方法最后不会添加换行符。您需要做的是获取Content-Length
并在最后一个空行之后读取许多字符。
实施例
假设我们有以下HTML
页面:
<html>
<head/>
<body>
<form action="http://localhost:12345/test.php" method="POST">
<input type="hidden" name="postData" value="whatever"/>
<input type="hidden" name="postData2" value="whatever"/>
<input type="submit" value="Go"/>
</form>
</body>
</html>
现在我们启动一个非常简单的服务器,它在某种程度上类似于你的代码(这段代码充满了整体,但这不是问题):
public class Main {
public static void main(final String[] args) throws Exception {
final ServerSocket serverSocket = new ServerSocket(12345);
final Socket clientSocket = serverSocket.accept();
final InputStreamReader reader = new InputStreamReader(clientSocket.getInputStream());
final BufferedReader bufferedReader = new BufferedReader(reader);
int contentLength = -1;
while (true) {
final String line = bufferedReader.readLine();
System.out.println(line);
final String contentLengthStr = "Content-Length: ";
if (line.startsWith(contentLengthStr)) {
contentLength = Integer.parseInt(line.substring(contentLengthStr.length()));
}
if (line.length() == 0) {
break;
}
}
// We should actually use InputStream here, but let's assume bytes map
// to characters
final char[] content = new char[contentLength];
bufferedReader.read(content);
System.out.println(new String(content));
}
}
当我们在我们最喜爱的浏览器中加载页面并按下Go
按钮时,我们应该在控制台中显示POST
正文的内容。