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
);