在 Java 中通过套接字发送图像(或二进制数据)
Sending image (or binary data) over sockets in Java
我正在从头开始编写一个 HTTP 服务器(尝试更深入地学习 HTTP),并且已经让服务器向客户端发送带有 HTML 的 HTTP 响应,没有太大问题。
当我尝试通过网络发送二进制数据(例如 JPEG 图像)时出现问题。浏览器似乎无法正确解释它。为此,我已将响应的 MIME 类型设置为 image/jpeg
,并且连同正确的 Content-Length
,我仍然无法正确传输数据。
对此有点困惑,想知道我对 Java 中如何读取二进制数据的理解或方法是否不正确?
我正在做的一般方法是将文件从磁盘读入 FileInputStream
,然后将数据读入 1024 字节缓冲区。当我读入缓冲区时,我将缓冲的数据写入 DataOutputStream
,其中客户端的套接字连接为 OutputStream
。我正在刷新并关闭数据。
我为 HTTP 响应生成正文的部分在这里:
FileInputStream fis = new FileInputStream("www/server.jpg");
byte[] buffer = new byte[1024];
DataOutputStream dos = new DataOutputStream(this.clientSocket.getOutputStream());
int read;
while((read=fis.read(buffer)) >= 0) {
dos.write(buffer, 0, read);
}
dos.flush();
fis.close();
dos.close();
我硬编码了一些东西,但我认为这通常可以解决我的问题。因此,当我发出如下所示的 HTTP 请求时,我收到以下响应:
在 FireFox 中图像试图呈现,但我收到消息:
我要显示的图片是:
有人有什么想法吗?
谢谢!
所以,@rkosegi 关于从 curl
下载文件的评论帮助我找出了问题所在。显然我在构建我的回复 body 不正确。发生的事情是在我的 HTTP 实体 headers 之后的 body 内容之前插入了一个新行。在流式传输 body 内容之前删除这个额外的换行符后,我能够让浏览器正确解释数据。
哦哦!
我正在从头开始编写一个 HTTP 服务器(尝试更深入地学习 HTTP),并且已经让服务器向客户端发送带有 HTML 的 HTTP 响应,没有太大问题。
当我尝试通过网络发送二进制数据(例如 JPEG 图像)时出现问题。浏览器似乎无法正确解释它。为此,我已将响应的 MIME 类型设置为 image/jpeg
,并且连同正确的 Content-Length
,我仍然无法正确传输数据。
对此有点困惑,想知道我对 Java 中如何读取二进制数据的理解或方法是否不正确?
我正在做的一般方法是将文件从磁盘读入 FileInputStream
,然后将数据读入 1024 字节缓冲区。当我读入缓冲区时,我将缓冲的数据写入 DataOutputStream
,其中客户端的套接字连接为 OutputStream
。我正在刷新并关闭数据。
我为 HTTP 响应生成正文的部分在这里:
FileInputStream fis = new FileInputStream("www/server.jpg");
byte[] buffer = new byte[1024];
DataOutputStream dos = new DataOutputStream(this.clientSocket.getOutputStream());
int read;
while((read=fis.read(buffer)) >= 0) {
dos.write(buffer, 0, read);
}
dos.flush();
fis.close();
dos.close();
我硬编码了一些东西,但我认为这通常可以解决我的问题。因此,当我发出如下所示的 HTTP 请求时,我收到以下响应:
在 FireFox 中图像试图呈现,但我收到消息:
我要显示的图片是:
有人有什么想法吗?
谢谢!
所以,@rkosegi 关于从 curl
下载文件的评论帮助我找出了问题所在。显然我在构建我的回复 body 不正确。发生的事情是在我的 HTTP 实体 headers 之后的 body 内容之前插入了一个新行。在流式传输 body 内容之前删除这个额外的换行符后,我能够让浏览器正确解释数据。
哦哦!