4

我正在尝试通过套接字发送图像,但遇到了一个奇怪的问题.. 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 年 4 月 14 日,这似乎是一个已确认的错误。错误号 6687964。为什么这还没有解决?...啊。

4

2 回答 2

1

我遇到了同样的问题。程序收到文件后,将确认发送回发件人。如果发送者写了一个转义字符new String("\n").getBytes()然后刷新 OutputStream 它应该结束缓冲流并允许你InputStream.ReadLine()在另一端。这应该得到多余的数据,循环的下一次重复将得到新的图像数据。我知道很烦人,但它有效

于 2012-12-06T16:24:23.260 回答
0

我想出的解决方法是:

(关于作为 ByteArrayOutputStream,并且作为套接字流)

                        ImageIO.write(part, "jpg", bout);
                        out.writeShort(bout.size());
                        bout.writeTo(out);
                        bout.reset();

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

于 2012-12-12T00:15:05.160 回答