我被迫为此使用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)。
如何让它发挥作用?
所以问题似乎如下:
在InputReader上使用两个读取器是不安全的。第一次读取可能会消耗一些数据,即使你没有明确地对其调用read。它会保持缓冲区已满。
因此,解决方案只是简单地使用相同的现成的。
我通过使用字节读取器删除标头来修复它。我可以使用这个字节阅读器来获取我的图片。
不要使用Socket,使用URL和HttpURLConnection:这就是它们的用途。你的代码中至少有一个HTTP协议错误,可能是良性的,但如果你使用正确的类,它就不会出现
这样做还可以通过提前读取和缓冲图像的一部分来消除BufferedReader,它是用来读取标头的,也是导致这个问题的原因。