java - BufferedReader 没有读取过去的空行

标签 java http inputstream bufferedreader

<分区>

我想弄清楚为什么我的 BufferedReader(从 InputStream 读取)只是挂起并且在收到空行后不读取。

尝试读入类似于以下内容的 POST 请求:

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

postData=whatever&moreData...

我知道发布数据已正确发送(以上述格式),但我无法检索发布的数据。我希望下面的代码打印出发布数据然后挂起等待更多..但是,实际发生的是它卡在“Content-Type”行之后。

while (true) {
    System.out.println(bufferedReader.readLine());
}

获取流的代码:

bufferedReader = new BufferedReader(clientSocket.getInputStream());

有人知道为什么会这样吗?

谢谢

最佳答案

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 正文的内容。

关于java - BufferedReader 没有读取过去的空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541157/

相关文章:

java - 替换输入流中的字符串段

java - 我的程序中的内存使用情况没有改变

java - 在 Java 中检测应用程序的安装路径?

javascript - 为什么 HTTP 是基于文本的而不是某种压缩方法?为什么 JS 没有被压缩?

java - java中同时使用InputStream和InputStreamReader

大字节的java Inputstream然后是127

java - 如何用java在Web服务器上编写

java - 使用 Java 打印,如何在同一打印行上混合 "%.2f"、变量和常规字符串?

Ruby - 从 URL 获取图像并将其转换为文本

http - 自定义请求 header 要遵循的标准