1

ソケット経由で送信したいオブジェクトを取得しました。私が得た出力について:

Socket s = serverSocket.accept();
ObjectOutputStream dout = new ObjectOutputStream(new GZIPOutputStream(s.getOutputStream()));
Msg m = new Msg("123", "123", karte);
dout.writeObject(m);
dout.reset(); //No I don't want to chache it

そして、私が得た入力について:

Socket s = new Socket(host, port);
ObjectInputStream din = new ObjectInputStream(new GZIPInputStream(s.getInputStream()));
Msg m = (Msg)din.readObject();

Msg オブジェクトはシリアライズ可能です。

このコードを実行すると、クライアント接続が得られ、サーバーもデータを送信しますが、クライアントは入力の読み取りを開始しません

助言がありますか?

すべての返信ありがとう

4

1 に答える 1

2

おそらく reset() を呼び出す前に出力ストリームをフラッシュしますか?

そうそう、もう 1 つ、最初に GZIP 出力を閉じる必要があるかもしれません。close() が呼び出される前に gzip ストリームをファイナライズしないと思います。その場合、そこに移動しているストリーム スタック全体を閉じて、再度開く必要がある場合があります。圧縮を個別に処理し、結果のみを出力ストリームにプッシュすることを検討してください。

サンプルコード:

Socket s = serverSocket.accept();
ByteArrayOutputStream compressed = new ByteArrayOutputStream();
GZIPOutputStream compressor = new GZIPOutputStream(compressed);

Msg m = new Msg("123", "123", karte);
m.writeObject (compressor);
compressor.close();

OutputStream fout = s.getOutputStream();
fout.write (compressed.toByteArray() );
fout.close ();

ストリームを閉じることができない場合は、少しトリッキーになります。サーバーがストリームを閉じない場合、EOS シグナルを取得できません。これは、着信バイトをバッファーに蓄積し (ByteArrayOutputStream が便利です)、何らかの終了シーケンスのためにバイトを手動でスキャンする必要があることを意味します。読み取りを停止して逆シリアル化を開始するタイミングを知っていること。

もちろん、上記のコードには保証人はいません... :p

于 2013-01-28T14:58:44.097 に答える