我设置了一个 ServerSocket 和一个 Socket,因此 ServerSocket 使用 ImageIO.write(....) 发送图像流,并且 Socket 尝试读取它们并用它们更新 JFrame。所以我想知道 ImageIO 是否可以检测到图像的结尾。(我完全不知道JPEG格式,所以我测试了它)
显然不是。
在服务器端,我通过在循环中使用 ImageIO.write(...) 连续发送图像,中间有一些睡眠。在客户端,ImageIO 读取第一个图像没有问题,但在下一个它返回 null。这令人困惑。我期待它要么阻止读取第一张图像(因为它认为下一张图像仍然是同一图像的一部分),要么成功读取所有图像(因为它有效)。到底是怎么回事?看起来 ImageIO 检测到了第一个图像的结尾,但没有检测到第二个图像的结尾。(顺便说一下,图像彼此大致相似)有没有一种简单的方法可以像这样流式传输图像,还是我必须制作自己的机制,将字节读入缓冲区,直到它达到指定的字节或序列字节,此时它从缓冲区中读取图像?
这是我的服务器代码的有用部分:
while(true){
Socket sock=s.accept();
System.out.println("Connection");
OutputStream out=sock.getOutputStream();
while(!socket.isClosed()){
BufferedImage img=//get image
ImageIO.write(img, "jpg", out);
Thread.sleep(100);
}
System.out.println("Closed");
}
我的客户代码:
Socket s=new Socket(InetAddress.getByName("localhost"), 1998);
InputStream in=s.getInputStream();
while(!s.isClosed()){
BufferedImage img=ImageIO.read(in);
if(img==null)//this is what happens on the SECOND image
else // do something useful with the image
}