1

我正在用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 );

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

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

在此处输入图像描述

4

1 回答 1

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 个。你最好只打印你读到的内容。

于 2013-05-03T11:30:26.857 回答