为什么代码显示“错误354(net :: ERR_CONTENT_LENGTH_MISMATCH):服务器意外关闭了连接。”

时间:2013-05-03 11:25:24

标签: sockets http tcp webserver

我正在 JAVA 中构建 HTTP WEB SERVER

如果客户端请求任何文件且该文件位于服务器中的该位置,则服务器将该文件提供给客户端。我也做了这个代码,它工作正常。

代码中显示上述功能的部分

File targ = [CONTAINS ONE FILE]
PrintStream ps;
InputStream is = new FileInputStream(targ.getAbsolutePath());
            while ((n = is.read(buf)) > 0) {
                System.out.println(n);
                ps.write(buf, 0, n);
            }  

但是现在为了优化我的代码,我用以下代码替换了这段代码,

   InputStream is = null;
    BufferedReader reader = null;
    String output = null;

    is = new FileInputStream(targ.getAbsolutePath());
    reader = new BufferedReader(new InputStreamReader(is));

        while( (output = reader.readLine()) != null) {
           System.out.println("new line");
           //System.out.println(output);
           ps.print(output);
        }

但它有时会显示一个错误Why code shows "Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection."。我不明白,为什么它显示这个错误。这个错误非常奇怪,因为服务器显示200代码,这意味着该文件就在那里。

请帮帮我。

编辑否。 1

    char[] buffer = new char[1024*16];
    int k = reader.read(buffer);
    System.out.println("size : " + k);
    do { 
       System.out.println("\tsize is : " + k);
       //System.out.println(output);
       ps.println(buffer);
    }while(  (k = reader.read(buffer)) != -1 );

这会打印所有文件,但对于较大的文件,它会显示不可读的字符。

显示以下输出 (客户端浏览器的快照)

enter image description here

1 个答案:

答案 0 :(得分:2)

您执行output = reader.readLine()获取数据,这会省略换行符。然后是ps.print(output),因此不会将换行符发送给客户端。

说你看过这个

Hello\r\n
World\r\n

然后你发送:

Content-length: 14

HelloWorld

然后关闭连接,混淆浏览器,因为它仍在等待其他4个字节。

我猜你必须使用ps.println(output)

如果您正在监控网络流量,您会看到这一点,这在编写或调试应该使用网络进行通信的服务器时非常有用。

无论如何,如果文件的换行符和系统不匹配(\n vs \r\n),这将导致问题。假设你有这个文件:

Hello\r\n
World\r\n

它的长度是14个字节。但是,当您的系统在打印为\n时处理换行符时,带有println()的代码会打印出来:

Hello\n
World\n

哪个是12个字节,而不是14个。你最好只打印你读的内容。