2013-07-19 83 views
1

我不得不爲此使用TCP套接字。使用HTTP協議通過TCP套接字獲取圖像

我需要查詢一些IP,從它得到一個圖像,並把它放在一個文件中。

所以我實際的代碼如下所示:

InetAddress ip = InetAddress.getByAddress(rawip); 
Socket socket = new Socket(ip, 80); 
PrintWriter pw = new PrintWriter(socket.getOutputStream()); 

pw.println("GET "+ url +" HTTP/1.1"); 
pw.println("Host: " + m_url.substring(4)); 
pw.println("Connection: Close"); 
pw.println("User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36"); 
pw.println(""); 
pw.flush(); 


BufferedReader in = new BufferedReader(new InputStreamReader (socket.getInputStream()), 1); 

String ln; 
//Reading header 
while((ln = in.readLine()) != null) 
{ 
    //if header is finished 
    if (ln.equals("")) break; 
} 

BufferedImage imgage = ImageIO.read(socket.getInputStream()); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(imgage, format, baos); 
baos.flush(); 
byte[] imageInByte = baos.toByteArray(); 
baos.close(); 

而且我得到以下錯誤:

java.lang.IllegalArgumentException: image == null! 

我先前手動讀取所有字節。我收到了這張照片,但是一開始有一些字節丟失(大約7000)。

如何讓它工作?

回答

1

所以它出現的問題如下:

使用兩個讀卡器上InputReader是不是安全。第一次讀取可能會消耗一些數據,即使您沒有明確地調用讀取它。它會保持緩衝區已滿。

所以解決方案只是使用相同的準備。

我通過使用字節閱讀器刪除頭來修復它。我可以在使用這個字節閱讀器來獲得我的照片之後。

0

不要爲此使用套接字,使用URL和HttpURLConnection:這就是他們的目的。您的代碼中至少有一個HTTP協議錯誤,可能是良性的,但如果您使用的是正確的類別,它將不會存在。

這樣做也會擺脫您用來讀取過去的BufferedReader頭文件,這是造成這個問題,通過讀取和緩衝部分圖像。

+0

我們受到限制,根本無法使用Http。 – pikaille

相關問題