明確にするために、ここで参照しているすべてのTCPClientは、私自身のクラスのインスタンスではなく、Monoの.NET4.0の実装からのSystem.Net.Sockets.TcpClientのインスタンスです。
サーバーと同じように、クライアント接続をリッスンしているサーバーがあります。新しいクライアントを取得するたびに、新しいスレッドで接続を処理するための新しいTCPClientを作成します。私は辞書ですべての接続とスレッドを追跡しています。クライアントが切断すると、サーバーに切断メッセージが送信され、TCPClientが閉じられ、ディクショナリエントリが削除され、スレッドが自然に停止します。大騒ぎも大騒ぎもありません。サーバーは複数のクライアントを問題なく処理できます。
ただし、クライアントが切断され、切断メッセージを送信してから再接続した場合に何が起こるかをシミュレートしています。クライアントがユーザー名システムに再接続したかどうかを検出しています(テストが完了すると、より安全になります)。新しいTCPClientを作成し、古いTCPClientを実行したままにすると、システムは正常に機能しますが、スペースを占有して何もしない無用なスレッドがたくさんあります。怠け者。
そのため、古い接続に関連付けられているTCPClientを閉じようとします。これを行うと、新しいTCPClientも停止し、クライアントプログラムは次のエラーをスローします。
E/mono (12944): Unhandled Exception: System.IO.IOException: Write failure ---> System.Net.Sockets.SocketException: The socket has been shut down
そして、サーバーはこのエラーをスローします:
Unable to write data to the transport connection: An established connection was aborted by the software in your host machine.
Cannot read from a closed TextReader.
したがって、次のようなリモートエンドポイントで古いTCPClientを閉じます。192.168.1.10:50001
また、次のようなリモートエンドポイントで新しいTCPClientを中断します。192.168.1.10:50002
したがって、2つのTCPClientオブジェクトのリモートエンドポイントIPアドレスは同じですが、リモートエンドポイントポートは異なります。しかし、一方を閉じると、もう一方が機能しなくなるようです。新しいTCPClientを閉じずに、古いTCPClientを閉じてクリーンアップを実行できるようにしたい。
これは、TCPClientが低レベルのソケットでどのように機能するかと関係があると思いますが、それを実際に理解していないため、修正する立場にありません。