2

クライアントとサーバー間で転送する必要のある新しいクラスを作成したため、ソケットでObjectOutputStreamを使用しています。また、接続を継続的に検査し、接続が有効であることを確認するために、ストリームを介して1秒ごとに1バイトをサーバーに送信する一意のスレッドを作成しました。

byte b=1;
oos.writeObject(b);

サーバーがより長いオブジェクトを読み取らないように送信できる最小のオブジェクトであるため、「バイト」を使用します(右?)。

私の質問は、サーバーが1バイトのオブジェクト(バイトのサイズ)を読み取るのか、8バイトのオブジェクト(オブジェクトのサイズ)を読み取るのかということです。

4

2 に答える 2

2

おそらくどちらでもない。まず、abyteがに自動ボックス化されますByte。次に、Byteが出力ストリームにシリアル化されます。送信にはおそらく8バイト以上かかります。仕様は正確にはわかりませんが、おそらくクラス名java.lang.Byteとバイト自体に加えて、さらにいくつかの制御バイトが送信されます。

わかりやすい方法-バイトをにシリアル化しByteArrayOutputStream、フラッシュしてから、最終的にObjectOutputStream何バイトになるかを確認ByteArrayOutputStreamします。

于 2012-09-04T21:39:29.860 に答える
1

ObjectOutputStreamを使用する必要がある場合、最初のオブジェクトが送信された後、そのオブジェクトへの参照が将来送信されるため、どのオブジェクトを送信するかは実際には重要ではありません。このため、のような特定の列挙型を送信することをお勧めします。

enum Control {
    HEARTBEAT
}

1バイトが1バイトであるDataOutputStreamを使用して、ワイヤフォーマットをはるかに小さくすることができます。IPパケットヘッダーが約20バイトであることを考えると、オーバーヘッドはこれよりはるかに高いため、1バイトを送信するか8バイトを送信するかは実際には問題ではありません。

于 2012-09-04T21:52:17.137 に答える