0

ユーザーがソケット接続を介してファイル(画像/ビデオ...)を送信できるようにするクライアント/サーバーチャットアプリケーションに取り組んでいます。

あらゆるコミュニケーションを管理するために、送信したいすべての情報を格納するオブジェクト「パケット」を使用します。(送信者、受信者、ファイル...)。

これが私がストリームに書くコードサンプルです:

private void write(Packet packet) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(bos);
    os.writeObject(packet);
    this.outStream.write(bos.toByteArray());
}

そして、outStreamはOutputStreamです。

これが私の接続実行です:

public void run() {
    while (isRunning()) {
        try {
            byte[] buffer = new byte[65536];
            // Read from the InputStream
            inStream.read(buffer);
            ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buffer));
            Packet p = (Packet) in.readObject();

        } catch (IOException e) {
            e.printStackTrace();
            this.disconnect();
        }
    }
}

ファイル転送以外のすべての目的で非常にうまく機能します!ファイルをbyte[](filestreamを使用)に入れ、配列をパケットオブジェクトに格納します。サーバーが通信を受信すると、「in.readObject()」で中断し、かなりの「java io streamcorruptedexception間違った形式:0」の例外が発生します。

カスタムbyte[](string.getBytes()で埋められている)を使用して転送を試しましたが、非常にうまく機能しました。

それで、私は何を間違っているのですか?

4

1 に答える 1

3

InputStream からバイト配列 (小さすぎる可能性がある任意のサイズ) に読み取っています。次に、このバイト配列から読み取る ObjectInputStream を作成します。オブジェクトを InputStream から直接読み取ってみませんか?

ObjectInputStream in = new ObjectInputStream(inStream);
Packet p = (Packet) in.readObject();

バッファは必要ありません。

さらに、InputStream.read() は InputStream からすべてを読み取るわけではありません。利用可能なものを読み取り、読み取ったバイト数を返します。-1 を返すまでループしないと、相手側で送信されたものの一部しか読み取れません。

ところで、あなたは送信側で同じ間違いをしています。オブジェクトを出力ストリームに直接書き込む代わりに、バイト配列に書き込み、次にこのバイト配列を送信します。オブジェクトをストリームに直接書き込みます。

ObjectOutputStream os = new ObjectOutputStream(this.outputStream);
os.writeObject(packet);

バッファは必要ありません。

于 2012-05-26T21:08:21.470 に答える