BufferedReader 没有读取过去的空行 [关闭]

Posted

技术标签:

【中文标题】BufferedReader 没有读取过去的空行 [关闭]【英文标题】:BufferedReader not reading past empty line [closed] 【发布时间】:2012-11-12 12:45:09 【问题描述】:

我试图弄清楚为什么我的 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());

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

谢谢

【问题讨论】:

请贴出获取码流的代码 我期望 bufferedReader = new BufferedReader( new URL( "http://..." ).openConnection());为什么要为 HTTP 使用套接字? 这是一个简单服务器的一部分 - 所以需要套接字 服务器 - 我正在读取发送的 POST 请求 - 因此尝试读取发布的数据(在空行之后)但无法检索它 如果这是 server 的一部分,为什么套接字句柄称为clientSocket?这是否意味着“与客户交谈的套接字?” 【参考方案1】:

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

【讨论】:

我知道这只是示例代码,但是,但是,但是……根据 RFC 2616 §4.2,“Content-Length”标头字段的冒号后面的空格不是必需的。此外,为了让未来的读者能够根据我们的建议提升代码,“Content-Length”标头不需要指示消息正文的边界。 RFC 2616 §4.4 定义了四个选项:“Content-Length”标头、分块传输编码、“multipart/byteranges”媒体类型,或客户端终止连接,指示到服务器的 EOF。 ietf.org/rfc/rfc2616.txt @seh 好吧,基本上我不想包含一个成熟的 HTTP 服务器的代码。该示例应该说明为什么 OP 的代码不起作用以及在非常有限的情况下可能的解决方案。 我明白了;因此我提到了“示例代码”。 @Aubin 曾问为什么 OP 没有在这里使用 HttpURLConnection,得到的答复是,“[T]他是一个简单服务器的一部分 - 所以需要套接字。”这足以让我担心他正在建造什么。 这就是问题所在——我没有通过读入 char/byte 数组来使用 InputStream。谢谢! @seh 我提供的只是所有代码的一小部分——我知道其他位在我对它们运行测试时有效,只是提取了这个发布的数据才是问题所在。但现在一切都整理好了:)

以上是关于BufferedReader 没有读取过去的空行 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MySql 单表,选择过去 7 天并包含空行

有没有办法使用 Python Pandas 读取所有行直到遇到空行

BufferedReader 可以读取字节吗?

使用 BufferedReader 读取所有行

java怎样读取本地文件夹下的文件

Python利用逐行读取readline()打印出现空行的解决办法