有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用HTTP协议通过TCPsocket获取图像

为此,我不得不使用TCPsocket

我需要查询一些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) 个答案

  1. # 1 楼答案

    不要使用套接字,使用URL和HttpURLConnection:这就是它们的用途。代码中至少有一个HTTP协议错误,可能是良性的,但如果使用了正确的类,就不会有

    这样做还可以消除BufferedReader,通过提前读取并缓冲图像的一部分,您正在使用它来读取标题,而这正是导致此问题的原因

  2. # 2 楼答案

    因此,问题似乎如下:

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

    因此,解决方案就是使用同样的现成产品

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