2011-12-30 30 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