java - Home Brew Java HTTP 服务器无法正确提供非文本文件

标签 java sockets http io

我的问题是我无法让非文本文件在浏览器中正确显示。在我的服务器的代码中,我使用 while 循环来监听请求。当请求到来时,我将 header 读入变量 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

有人知道我为什么会遇到这个问题吗?

最佳答案

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

关于java - Home Brew Java HTTP 服务器无法正确提供非文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827173/

相关文章:

java - Lettuce 是否支持 Redis 集群中的管道操作?

node.js - 为什么我的 socket.io 事件会成 block 地发生?

sockets - 套接字未阻塞写入操作 : OpenSolaris

java - 如何使用java从mysql获取数据

java - 如何在 Swing 应用程序中混合使用 Java Swing 和 JavaFX?

c - Unix 套接字 : Client stops receiving messages correctly after first message

java - Android 对 Web API 的多部分请求未获取与请求关联的文本

performance - 如何压缩 CouchDB 的 HTTP 响应中的 JSON 内容?

javascript - 对 Node 顺序规则感到困惑(同步/异步)

java - 机器人 : How to know about a new process start in device?