Java BufferedReader未读取超过空行的内容

Java BufferedReader未读取超过空行的内容,java,http,inputstream,bufferedreader,Java,Http,Inputstream,Bufferedreader,我试图弄清楚为什么我的BufferedReader(从InputStream读取)在收到空行后挂起而不读取 尝试读入一个POST请求,该请求类似于: POST /test.php HTTP/1.0 Content-Length: 30 Content-Type: text/html; postData=whatever&moreData... 我知道post数据被正确发送(以上面的格式),但是我无法检索post数据。我希望下面的代码打印出post数据,然后挂起等待更多。。但是,实际情

我试图弄清楚为什么我的BufferedReader(从InputStream读取)在收到空行后挂起而不读取

尝试读入一个POST请求,该请求类似于:

POST /test.php HTTP/1.0
Content-Length: 30
Content-Type: text/html;

postData=whatever&moreData...
我知道post数据被正确发送(以上面的格式),但是我无法检索post数据。我希望下面的代码打印出post数据,然后挂起等待更多。。但是,实际情况是它挂在“Content-Type”行之后

用于获取流的代码:

bufferedReader = new BufferedReader(clientSocket.getInputStream());
有人知道为什么会这样吗


谢谢

POST方法不会在末尾添加换行符。您需要做的是获取
内容长度
,在最后一个空行之后读取那么多字符

范例

假设我们有以下
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>

当我们在我们最喜欢的浏览器中加载页面并按下
Go
按钮时,我们应该在控制台中发布
POST
正文的一些内容。

请发布用于获取流的代码i expected bufferedReader=new bufferedReader(新URL(“http://...);为什么要为HTTP使用套接字?这是简单服务器的一部分-因此需要套接字服务器-我正在读取发送的POST请求-因此尝试读取发布的数据(在空行之后),但无法检索它如果这是服务器的一部分,为什么套接字句柄称为
clientSocket
?这是否意味着“与客户机对话的套接字?”我知道这只是示例代码,但是。。。根据RFC 2616§4.2,“内容长度”标题字段冒号后的空格不是必需的。另外,为了方便将来的读者根据我们的建议来提升代码,“Content-Length”头不需要指示消息体的边界。RFC 2616§4.4定义了四个选项:“内容长度”标题、分块传输编码、“多部分/byteranges”媒体类型,或客户端终止连接,指示与服务器的EOF@嗯,基本上我不想包含一个完全成熟的HTTP服务器的代码。这个例子是为了说明为什么OP的代码不起作用,以及在非常有限的情况下可能的解决方案;因此,我提到了“示例代码”。@Aubin曾问OP为什么不在这里使用
HttpURLConnection
,回答是,“这是一个简单服务器的一部分,所以需要套接字。”这足以让我担心他在构建什么。这就是问题所在——我没有通过读取字符/字节数组来使用InputStream。谢谢@seh我给出的只是所有代码的一小部分——我知道其他的部分在我对它们进行测试时起作用,问题在于提取这些发布的数据。但现在都排序了:)
<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));
    }
}