使用HTTP协议通过TCP套接字获取图像

时间:2013-07-19 17:58:32

标签: java image sockets http tcp

我不得不为此使用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个)。

如何让它发挥作用?

2 个答案:

答案 0 :(得分:1)

所以看来问题如下:

在InputReader上使用两个阅读器是不安全的。即使您没有明确地调用read,第一次读取也可能会消耗一些数据。它将保持缓冲区满。

因此解决方案就是为两者使用相同的准备工作。

我通过使用字节读取器删除标头来修复它。我可以在使用这个字节阅读器来获取我的照片。

答案 1 :(得分:0)

不要使用Socket,使用URL和HttpURLConnection:这就是他们的目的。您的代码中至少有一个HTTP协议错误,可能是良性的,但如果您使用的是正确的类,它就不会出现

这样做也可以摆脱你用来读取标题的BufferedReader,并通过提前读取并缓冲部分图像来解决这个问题。