TcpListener クラスの分析
(1)TcpClient client = server.AcceptTcpClient();を実行すると、TcpClientの接続待ちとなる。接続待ちの間は、実行が完了しないため、サーバー アプリケーションの実行が中止されロック状態となる。
(2)stream.Read(bytes, 0, bytes.Length)を実行すると、NetworkStreamのデータ受信待ちとなる。データ受信待ちの間は、実行が完了しないため、サーバー アプリケーションの実行が中止されロック状態となる。
(3)本サンプルでは、データ受信のタイミングでデータ返信を行っている。
(4)本サンプルでは、データ受信のタイミングでデータ返信を行った後、接続を切断している。
(5)接続の切断を行わない場合は、任意のタイミングでサーバ側からクライアント側に送信が可能である。
(6)以下のコードに変更するとデータ受信待ちのロック状態を防止できる。
if (stream.DataAvailable)
{
int i = stream.Read(bytes, 0, bytes.Length);
if (i != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
textBox3.AppendText(data);
}
}
長所:
(1)コード記述が最も簡潔でわかりやすい。
(2)データ受信後の接続の切断をやめることにより、任意のタイミングでサーバ側からクライアント側に送信が可能である。
短所:
(1)TcpClientの接続待ちの状態で接続が完了するまでの間、サーバー アプリケーションがロック状態となる。
(2)データ受信待ちも同様にロック状態となるが、stream.DataAvailable を使用することによりロック状態を防止できる。 R2
(3)ロック状態から終了する場合は、Windowsタスクマネージャーを使用して強制終了が必要となる。