サウンドストリームと画像シーケンスデータをArrayList
でバインドして、同期化し、ネットワークストリーム経由でバイナリフォーマッタでシリアル化しようとしました。 サーバー側で例外がスローされました。複数のオブジェクトを1つのネットワークストリームで送信するC#
ストリームはシーク操作をサポートできません。
私は
サウンドストリームと画像シーケンスデータをArrayList
でバインドして、同期化し、ネットワークストリーム経由でバイナリフォーマッタでシリアル化しようとしました。 サーバー側で例外がスローされました。複数のオブジェクトを1つのネットワークストリームで送信するC#
ストリームはシーク操作をサポートできません。
私は
TCPはストリームベースであり、メッセージベースではありません(UDPの場合)。つまり、メッセージの開始または終了を知らせることはありません。 TCPは、すべてのバイトが正しい順序で受信されることを保証します。 Send()
で送信されたすべてがReceive()
で受信されることを保証するものではありません。
したがって、何らかのメッセージ識別メカニズムを指定する必要があります。この場合、Jonが提案しているようにヘッダーが移動する方法です。
ただし、ヘッダー全体を一度に受信できないことを理解する必要があります。そして、2つのメッセージが一度に到着するかもしれません。したがって、デシリアライズのために何かを送る前に、受信したバッファを解析する必要があります。BinaryFormatter
単一ネットワークストリームインスタンス上で送信されるようにオブジェクトを同期するために、私はそれぞれのメッセージが構成されて独立した「メッセージ」に出て送信したいオブジェクトを分割します行うには何が必要ですボディの長さを示す4バイトの(例えば)4バイト、次にボディ自体を示します。
シリアル化されたオブジェクトを送信する場合は、バイト配列にシリアル化し、長さを書き出してからデータを書き出します。
サーバー側では、長さを読み取り、その多くのデータをバイト配列に読み込み、そのメッセージから逆シリアル化します。受信ストリームは、オブジェクトではなくメッセージの読み取りにのみ使用されます。
私は2つのオブジェクトを持っているとしましょうAとB ...ビットマップ圧縮イメージを含むMp3フレームとBを含んでいます。オブジェクトを含むことができるようにArrayListのオブジェクトをバインドしていました。それはBinaryFormattersを使用し、ネットワークストリーム上でそれを送信します。しかし、それは私が上に記載した例外を投げた – Samie
それはすべてがまだ到着していないのでです。 'byte []'バッファを手動で構築する必要があります(または 'MemoryStream')。ネットワークストリームを逆シリアル化するだけでは不十分です。 – jgauffin