2011-12-30 45 views
1

这是我到目前为止,读取的图像文件通过Java Socket技术

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。

在此先感谢。

+0

由于您好像是从HTTP查询,为什么不使用HTTP客户端实现而不是原始套接字? – fge 2011-12-30 11:47:46

+0

我需要使用套接字进行练习。 – 2011-12-30 11:49:58

+0

打印图像字节并在写入前和读取后进行比较。如果它匹配,那么在传输中没有问题。那么我们看看其他方面。 – 2011-12-30 11:58:52

回答

2

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

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

如果你想使用你必须解析HTTP响应和手动提取从HTTP应答数据普通插座:读/跳过头,读取二进制数据,并将其传递给ImageIO.read(或寻求流纠正位置并传递给ImageIO.read)。

+0

我被限制使用普通套接字。你的意思是我需要摆脱我在问题中提到的HTTP Header部分? – 2011-12-30 11:52:38

+0

@nevayeshirazi是的,当然你需要获得纯文本图像的二进制数据将其传递给ImageIO.read方法。 – 4ndrew 2011-12-30 11:58:46

+0

好吧,它是有道理的。感谢您的回答。 – 2011-12-30 12:00:08