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);

2 回目の反復では、ImageIO.read が相手側から送信されたすべてのデータを読み取っていないため、マジック ナンバーは失敗します。どうしてこれなの?重大な問題のようです。または、何か不足していますか?

編集: これは 2008 年 4 月 14 日の時点で確認済みのバグのようです。バグ ID 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 に答える