【问题标题】:Read Image File Through Java Socket通过 Java Socket 读取图像文件
【发布时间】:2012-01-30 12:51:19
【问题描述】:

这是我目前所拥有的,

Socket clientSocket = new Socket(HOST, PORT);

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

InputStream is = socket.getInputStream();
byte[] byteChunk = new byte[1024];

int c = is.read(byteChunk);

while (c != -1){
    buffer.write(byteChunk, 0, c);
    c = is.read(byteChunk);
}

BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(buffer.toByteArray()));

我的代码问题是 ImageIO.read() 返回 null。

当我打印 ByteArrayOutputStream 对象的内容时,我得到的是标题部分

HTTP/1.1 200 OK
Date: Fri, 30 Dec 2011 11:34:19 GMT
Server: Apache/2.2.3 (Debian) ...........
Last-Modified: Tue, 20 Dec 2011 19:12:23 GMT
ETag: "502812-490e-4b48ad8d273c0"
Accept-Ranges: bytes
Content-Length: 18702
Connection: close
Content-Type: image/jpeg

后跟一个空行加上许多带有不同字符的行,例如Àã$sU,e6‡Í~áŸP;Öã…

我的问题还是ImageIO.read() 函数返回null。

提前致谢。

【问题讨论】:

  • 既然您似乎是从 HTTP 查询,为什么不使用 HTTP 客户端实现而不是原始套接字?
  • 我需要使用套接字进行练习。
  • 打印图像字节并在写入前和读取后比较它们。如果匹配,则传输没有问题。然后我们再看其他方面。
  • 我假设您正在使用 docs.oracle.com/javase/6/docs/api/javax/imageio/…, java.lang.String, java.io.OutputStream) 将图像写入套接字。注意,写的时候需要指定图片格式。

标签: java http sockets http-headers


【解决方案1】:

为什么您不想使用简单的 http URL 从主机获取图像? 我的意思是:

URL imageURL = new URL("http://host:port/address");
BufferedImage bufferedImage = ImageIO.read(imageURL);

如果您想使用普通套接字,您必须手动解析 http 响应并从 http 回复中提取数据:读取/跳过标头,读取二进制数据并将其传递给 ImageIO.read(或寻找流以正确位置并传递流到ImageIO.read)。

【讨论】:

  • 我只能使用普通套接字。你的意思是我需要摆脱我在问题中提到的 HTTP Header 部分吗?
  • @nevayeshirazi 是的,当然您需要获取纯图像二进制数据才能将其传递给 ImageIO.read 方法。
  • 好吧,这是有道理的。谢谢你的回答。
  • -1 表示没有答案和“大量代码” - 1/跳过标头 2/获取正文 3/保存(如果您不确定流的来源/类型,您可以随时检查标头/内容-类型)
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 2012-12-02
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多