Home Brew Java HTTP Server无法正确提供非文本文件

时间:2014-09-13 20:04:09

标签: java sockets http io

我的问题是我无法在浏览器中正确显示非文本文件。在我的服务器的代码中,我使用while循环来监听请求。当请求进入时,我将标题读入变量headers。之后,我检查请求是否是GET请求。如果是,那么我检查文件是否存在,并且它是文件而不是目录。然后,我查看文件的扩展名以确定HTTP响应中的下一行。

pw.print("HTTP/1.1 Status: 200 OK\r\n");
String ext = file.getName().substring( file.getName().lastIndexOf('.') + 1, file.getName().length() );
if(ext.equals("txt"))
{
    pw.print("Content-Type: text/plain\r\n\r\n");
}
else if(ext.equals("html"))
{
    pw.print("Content-Type: text/html\r\n\r\n");
}
else if(ext.equals("jpg"))
{
    pw.print("Content-Type: image/jpeg\r\n\r\n");
}
else if(ext.equals("png"))
{
    pw.print("Content-Type: image/png\r\n\r\n");
}
else if(ext.equals("pdf"))
{
    pw.print("Content-Type: application/pdf\r\n\r\n");
}

if( !ext.equals("txt") && !ext.equals("html") )
{
    ImageInputStream imageStream = ImageIO.createImageInputStream(file);
    BufferedImage bufferedImage = ImageIO.read(file);
    ImageIO.write(bufferedImage, ext, socket.getOutputStream());
}

现在,据我所知,一旦我进入最后一个条件(我正在请​​求localhost:port/my_png.png),那么内容应该写入套接字,因为我告诉它Content-Type应该是,浏览器应该能够解释该文件。不幸的是,这种情况并没有发生。我在浏览器中获取文本输出是字节。我的输出看起来像这样:

‰PNG
���
IHDR���i���`���‘ïË¥��%IDATxÚíœ=h#×úÆ]ÜBE

有谁知道为什么我遇到这个问题?

1 个答案:

答案 0 :(得分:0)

@morgano:是的,在写信pw.flush()之前我需要socket。非常感谢。