HTTP 服务器不发送输出流中的最后一个字符
HTTP Server not sending the last character in an Output Stream
我正在尝试使用套接字构建 HTTP 服务器,但我遇到了一个奇怪的问题。一切似乎都正常,但是当我使用浏览器获取 html 文件或 txt 文件时,我没有获取最后一个字符。
例如,我有一个非常标准的测试 .html 文件。该文件恰好在 </html>
之后结束,因此浏览器获取整个文件但以 </html
.
结尾
至于图像,它们似乎已损坏,但我认为这与之前的问题有关。
代码如下:
printWriter.println(
this.getStatusLineFromStatusCode(statusCode) + CRLF
+ "Date: " + currentTime + CRLF
+ "Server: Definitely not Apache" + CRLF
+ ( (statusCode == 200) ?
"Last-Modified: " + lastModified + CRLF : "" )
+ "Content-Length: " + dir.length() + CRLF
+ "Content-Type: " + fileType + CRLF + CRLF
);
if(request.get("requestMethod").equals("GET")
&& dir.exists() && dir.isFile()) {
FileInputStream in = null;
try {
System.out.println(dir.getPath());
in = new FileInputStream(dir.getPath());
int c;
while((c = in.read()) != -1) {
outputStream.write(c); // Here is the write operation
}
} catch(Exception e) {
System.out.println(e);
} finally {
if(in != null) {
in.close();
}
}
}
printWriter.close();
我评论了写入发生的部分。这真的很奇怪,因为如果我使用 FileOutputStream 同时将文件复制到磁盘中的其他位置,文件将被正确复制。
有人知道为什么会这样吗?
问题是,您正在打印 CRLF + CRLF
,但也在打印 println
,这会添加另一行。这个额外的新行被认为是内容的一部分,并且由于内容长度 header 是预定义的,实际内容的最后一个字符被丢弃。
很快,请在以下部分使用 print
而不是 println
:
printWriter.println(
this.getStatusLineFromStatusCode(statusCode) + CRLF
+ "Date: " + currentTime + CRLF
+ "Server: Definitely not Apache" + CRLF
+ ( (statusCode == 200) ?
"Last-Modified: " + lastModified + CRLF : "" )
+ "Content-Length: " + dir.length() + CRLF
+ "Content-Type: " + fileType + CRLF + CRLF
);
我正在尝试使用套接字构建 HTTP 服务器,但我遇到了一个奇怪的问题。一切似乎都正常,但是当我使用浏览器获取 html 文件或 txt 文件时,我没有获取最后一个字符。
例如,我有一个非常标准的测试 .html 文件。该文件恰好在 </html>
之后结束,因此浏览器获取整个文件但以 </html
.
至于图像,它们似乎已损坏,但我认为这与之前的问题有关。
代码如下:
printWriter.println(
this.getStatusLineFromStatusCode(statusCode) + CRLF
+ "Date: " + currentTime + CRLF
+ "Server: Definitely not Apache" + CRLF
+ ( (statusCode == 200) ?
"Last-Modified: " + lastModified + CRLF : "" )
+ "Content-Length: " + dir.length() + CRLF
+ "Content-Type: " + fileType + CRLF + CRLF
);
if(request.get("requestMethod").equals("GET")
&& dir.exists() && dir.isFile()) {
FileInputStream in = null;
try {
System.out.println(dir.getPath());
in = new FileInputStream(dir.getPath());
int c;
while((c = in.read()) != -1) {
outputStream.write(c); // Here is the write operation
}
} catch(Exception e) {
System.out.println(e);
} finally {
if(in != null) {
in.close();
}
}
}
printWriter.close();
我评论了写入发生的部分。这真的很奇怪,因为如果我使用 FileOutputStream 同时将文件复制到磁盘中的其他位置,文件将被正确复制。
有人知道为什么会这样吗?
问题是,您正在打印 CRLF + CRLF
,但也在打印 println
,这会添加另一行。这个额外的新行被认为是内容的一部分,并且由于内容长度 header 是预定义的,实际内容的最后一个字符被丢弃。
很快,请在以下部分使用 print
而不是 println
:
printWriter.println(
this.getStatusLineFromStatusCode(statusCode) + CRLF
+ "Date: " + currentTime + CRLF
+ "Server: Definitely not Apache" + CRLF
+ ( (statusCode == 200) ?
"Last-Modified: " + lastModified + CRLF : "" )
+ "Content-Length: " + dir.length() + CRLF
+ "Content-Type: " + fileType + CRLF + CRLF
);