我正在 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 );
这会打印所有文件,但对于较大的文件,它会显示不可读的字符。
显示以下输出 (客户端浏览器的快照)
答案 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个。你最好只打印你读的内容。