2013-07-19 82 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

相关问题