0

こちらがシチュエーション...

サーバ

  • TcpListener接続を受け入れているサーバーがあります
  • TcpClient.GetStream()接続が確立されると、バッファリングされたストリームでラップします。
  • 次に、を使用してBinaryFormatter、ストリームからの受信データを逆シリアル化しています

クライアント

  • サーバーに接続します
  • TcpClient.GetStream()接続したら、バッファリングされたストリームにラップします。
  • 次にBinaryFormatter、ストリームを介してデータをシリアル化するために a を使用します。

接続がアクティブである限り、すべてがうまく機能します。私は何時間にもわたってテストしました。

問題

  • 次に、サーバーを停止してネットワーク障害をシミュレートします (localhost を使用しています)。
  • クライアントは障害を検出します (例外のスロー/処理)
  • TcpClientクライアントは後で新しいものと新しいもので再接続しますBufferedStream
  • クライアントは newBinaryFormatterを使用して、データのシリアライズを再開します。

ただし、サーバーはあらゆる種類の奇妙なデシリアライゼーション例外を取得します。ストリームのバイトを調べたところ、驚いたことに、ストリームが破損していることがわかりました!...しかし、再接続シーンの後でのみです。また、 を削除して を直接BufferedStream使用すると、問題が解決します。NetworkStreamこの問題が発生することなく、何度でも再接続できます。

で何が起こっているのBufferedStreamですか?再接続するたびに新しい を作成しますBufferedStreamが、前のストリームが新しいストリームに何らかの影響を与える可能性はありますか?

誰もこのようなものを見たことがありますか?

残念ながら、コード全体を投稿することはできませんが、ここに私がやっていることの例があります...

サーバーコードの例

while (true)
{//Accept connections and spawn threads to handle incoming connections
     TcpClient connection = server.AcceptTcpClient();
}

//Done on another thread
Stream stream = new BufferedStream(connection.GetStream());
BinaryFormatter formatter = new BinaryFormatter();
object data = formatter.Deserialize(stream);

サンプル クライアント コード

_connection = new TcpClient();
_connection.Connect(_remoteAddress);
NetworkStream netStream = _connection.GetStream();
Stream stream = new BufferedStream(netStream);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, data);
stream.Flush();

BufferedStream を使用しなくても、すべて正常に動作します。また、再接続時も上記のクライアント処理を繰り返します。

4

1 に答える 1

0

最初に MemoryStream に書き込み、次に MemoryStream.WriteTo(Stream) を呼び出してデータをバッファリングされていない NetworkStream に書き込むことで、速度をあまり犠牲にすることなく再接続の問題に対処しました。この解決策は機能しますが、それでも BufferedStream の問題は説明されません。また、何かを送信する前にオブジェクト全体をシリアル化する必要があるため、大きなオブジェクトの送信にはあまり適していません。

BufferedStream の問題が何であるかはまだわかりません。さらにややこしいことに、あるマシンではコードが問題なく動作するのに、別のマシンでは問題なく動作することがわかりました。ドライバーの問題である可能性はありますか?

しかし、最初に MemoryStream にシリアライズしてから MemoryStream.WriteTo(Stream) を呼び出すと、私にとっては十分に機能し、テストしたすべてのマシンで正常に動作するので、それを使用しました。

于 2014-05-29T23:18:42.040 に答える