我正在尝试通过套接字发送图像,我遇到了一个奇怪的问题.ImageIO.write发送的数据比ImageIO.read接收的数据多。例如,如果我在循环中有以下代码:
(客户端)
out.writeByte(222);//magic num for testing
out.writeByte(blockSize);
out.writeByte(x / blockSize);
out.writeByte(y / blockSize);
ImageIO.write(part, "PNG", out);
(服务器端)
if (din.readUnsignedByte() != 222) {
throw new RuntimeException();
}
int partSize = din.readUnsignedByte();
int partX = partSize * din.readUnsignedByte();
int partY = partSize * din.readUnsignedByte();
BufferedImage part = ImageIO.read(din);
在第二次迭代中,幻数将失败,因为ImageIO.read尚未读取从另一端发送的所有数据。为什么是这样?这似乎是一个重大问题。或者我错过了什么?
编辑:截至2008-04-14,这似乎是一个确认的错误。错误ID 6687964。为什么没有这个问题得到解决?agh。答案 0 :(得分:1)
我遇到了同样的问题。程序收到文件后,将确认发送回发件人。如果发送方写入转义字符new String("\n").getBytes()
,则刷新OutputStream,它应该结束缓冲的流,并允许您在另一端InputStream.ReadLine()
。这应该得到多余的数据,循环的下一次重复将获得新的图像数据。我知道这很烦人,但它确实有效。
答案 1 :(得分:0)
我想出了一个解决方法:
(回合是ByteArrayOutputStream,而不是套接字流)
ImageIO.write(part, "jpg", bout);
out.writeShort(bout.size());
bout.writeTo(out);
bout.reset();
此代码会在写入图像之前将图像的大小作为短片发送,从而防止出现错误。