Java ImageIO.write发送的数据多于ImageIO.read接收的数据?

时间:2012-12-04 00:47:15

标签: java sockets networking javax.imageio

我正在尝试通过套接字发送图像,我遇到了一个奇怪的问题.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。

2 个答案:

答案 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();

此代码会在写入图像之前将图像的大小作为短片发送,从而防止出现错误。