.NET Tips/Socket
接続の方法
ネットワーク通信を行うために使用する基本的なクラスは System.Net.Sockets.Socket クラスを使用します。このクラスはどのようなプロトコルもサポートし、サーバ / クライアントいずれの用途にも使用できます。しかし、 TCP 、 UDP 接続においては、専用のクラスが用意されています。 TCP (クライアント) は System.Net.Sockets.TcpClient クラス、 TCP (サーバ) は System.Net.Sockets.TcpListener クラス、 UDP は System.Net.Sockets.UdpClient クラスです。
TCP クライアントの使用方法
TcpClient クラスはリモート ホストに TCP 接続を行います。同期ブロッキング モードで動作します。
接続
コンストラクタにリモート ホストを指定するか、 TcpClient#Connect メソッドを呼び出します。
- コンストラクタ
TcpClient tcpClient = new TcpClient("localhost", 8888);
- Connect メソッド
TcpClient tcpClient = new TcpClient(); tcpClient.Connect("localhost", 8888);
接続に失敗すると SocketException 例外がスローされます。
送受信
データを送受信するには NetworkStream クラスを使用します。
NetworkStream インスタンスを取得するには TcpClient#GetStream メソッドを呼び出します。
NetworkStream stream = tcpClient.GetStream();
データを送信するには NetworkStream#Write メソッドを呼び出します。このメソッドはバイトデータを送信することができます。
byte[] byteData = ... stream.Write(byteData, 0, byteData.Length);
文字列を送信する場合、一度、バイトデータに直してから送信することになります。
string text = "ほげ"; byte[] byteData = Encoding.UTF8.GetBytes(text); stream.Write(byteData, 0, byteData.Length);
データを受信するには NetworkStream#Read メソッドを呼び出します。このメソッドはバイトデータを受信することができます。
byte[] byteData = new byte[1024]; int len = stream.Read(byteData, 0, byteData.Length);
戻り値は実際に読み取れたバイト数です。文字列を受信する場合、このバイトデータから文字列を構築する必要があります。
byte[] byteData = new byte[1024]; int len = stream.Read(byteData, 0, byteData.Length); string text = Encoding.UTF8.GetString(byteData, 0, len);
NetworkStream クラスによるデータの送受信はブロッキング モードで動作します。つまり、 NetworkStream#Read メソッドを呼び出したときにリモート ホストからデータを受信していない場合、データを受信するまでブロックされます。データを受信しているかどうかは NetworkStream#DataAvailable プロパティで調べることができます。
if (stream.DataAvailable) { byte[] byteData = new byte[1024]; int len = stream.Read(byteData, 0, byteData.Length); string text = Encoding.UTF8.GetString(byteData, 0, len); }
読み取るデータがない場合、リモート ホストと接続している間は NetworkStream#Read メソッドはブロッキングしますが、リモート ホストが接続を切断した場合、ストリームは末尾に達します。つまり、 NetworkStream#Read メソッドはすぐに 0 を返します。
NetworkStream インスタンスは使い終わったら閉じる必要があります。閉じるには NetworkStream#Close メソッドを呼び出します。 NetworkStream インスタンスを閉じてもネットワーク接続は閉じません。
stream.Close();
切断
切断するには TcpClient#Close メソッドを呼び出します。
tcpClient.Close();
TCP リスナーの使用方法
TcpListener クラスはネットワーク クライアントからの接続を待機します。同期ブロッキング モードで動作します。
接続要求の待機
コンストラクタにバインドするローカル IP アドレスとポート番号を指定します。
IPAddress ip = Dns.Resolve("localhost").AddressList[0]; TcpListener tcpListener = new TcpListener(ip, 8888);
ローカル IP アドレスが複数存在しそのどれを割り当てても良い場合、 IPAddress.Any を指定することができます。
TcpListener tcpListener = new TcpListener(IPAddress.Any, 8888);
TcpListener#Start メソッドを呼び出すと、ローカル エンド ポイントにバインドし、ネットワーク クライアントによる接続の待機を開始します。
tcpListener.Start();
接続の確立
TcpListener クラスは、ネットワーク クライアントからの接続要求を待ち行列に追加します。 TcpListener#AcceptTcpClient メソッドを呼び出すと、待ち行列から接続要求を取得し、接続を確立します。
TcpClient tcpClient = tcpListener.AcceptTcpClient();
待ち行列に接続要求が存在しない場合、接続要求が来るまでブロックされます。 TcpListener#Pending メソッドを呼び出すと、待ち行列に接続要求が存在するかどうかを判断することができます。
待機の終了
TcpListener#Stop メソッドを呼び出すと、接続要求の待機を終了し、ローカル エンド ポイントはアンバインドします。
tcpListener.Stop();
既に接続が確立した TcpClient インスタンスは 1 つずつ閉じる必要があります。
2005年12月25日(日) 20:34:10 Modified by uguuxp