java - 使用 HTTP 协议(protocol)通过 TCP 套接字获取图像

标签 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 个字节)。

如何让它工作?

最佳答案

看来问题如下:

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

所以解决方案就是对两者使用相同的准备。

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

关于java - 使用 HTTP 协议(protocol)通过 TCP 套接字获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17752596/

相关文章:

java - 发票/影像 : Remove noise in image

java - 如何让 Jackson 在序列化时不将字段输出到 XML

image - 如何在 Adob​​e Illustrator 9 中找到链接图像的路径?

c# - 绘制阴影

c++ - 如何在 C++ 编程中从 wget 创建的套接字中检索 RTT?

iOS - 从套接字获取 CFReadStream/CFWriteStream

java - 对于参数类型 int、int[],运算符 + 未定义

java - 在 Play Framework 中跨 Controller 和 View 维护请求参数

java - 设置 eclipse java compiler compliance level 1.6 是否与使用 JDK 1.6 编译相同?

C++ 写入套接字导致程序结束