1

我被迫为此使用 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)。

如何让它工作?

4

2 回答 2

1

所以看来问题如下:

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

因此,解决方案是简单地为两者使用相同的准备。

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

于 2013-07-19T19:44:42.460 回答
0

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

这样做还可以摆脱用于读取标题的 BufferedReader,这会导致此问题,方法是提前读取并缓冲图像的一部分。

于 2013-07-20T00:32:59.403 回答