こちらがシチュエーション...
サーバ
TcpListener
接続を受け入れているサーバーがありますTcpClient.GetStream()
接続が確立されると、バッファリングされたストリームでラップします。- 次に、を使用して
BinaryFormatter
、ストリームからの受信データを逆シリアル化しています
クライアント
- サーバーに接続します
TcpClient.GetStream()
接続したら、バッファリングされたストリームにラップします。- 次に
BinaryFormatter
、ストリームを介してデータをシリアル化するために a を使用します。
接続がアクティブである限り、すべてがうまく機能します。私は何時間にもわたってテストしました。
問題
- 次に、サーバーを停止してネットワーク障害をシミュレートします (localhost を使用しています)。
- クライアントは障害を検出します (例外のスロー/処理)
TcpClient
クライアントは後で新しいものと新しいもので再接続しますBufferedStream
- クライアントは new
BinaryFormatter
を使用して、データのシリアライズを再開します。
ただし、サーバーはあらゆる種類の奇妙なデシリアライゼーション例外を取得します。ストリームのバイトを調べたところ、驚いたことに、ストリームが破損していることがわかりました!...しかし、再接続シーンの後でのみです。また、 を削除して を直接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 を使用しなくても、すべて正常に動作します。また、再接続時も上記のクライアント処理を繰り返します。