TcpClient クラスは、TCP を使用してインターネット リソースからのデータを要求します。TcpClient のメソッドやプロパティを使用すると、TCP を使用してデータを要求および受信するための Socket の作成について詳細を考慮する必要がなくなります。リモート デバイスへの接続がストリームとして表されるため、.NET Framework のストリーム処理技術によってデータを読み書きできます。
TCP プロトコルは、リモートのエンドポイントとの接続を確立してから、その接続を使用してデータ パケットの送受信を行います。TCP は、データ パケットが確実にエンドポイントに送信され、着信時に正しい順序で組み立てられるようにします。
TCP 接続を確立するには、必要なサービスをホストするネットワーク デバイスのアドレスと、そのサービスが通信に使用する TCP ポートを把握しておく必要があります。一般的なサービスが使用するポート番号は IANA (Internet Assigned Numbers Authority) が定義しています。http://www.iana.org/assignments/port-numbers (英語情報) を参照してください。IANA の一覧に記載されていないサービスは、1,024 ~ 65,535 の範囲のポート番号を使用できます。
TCP のポート番号 13 でタイム サーバーに接続するように TcpClient を設定するコード例を次に示します。
Imports System
Imports System.Net.Sockets
Imports System.Text
Public Class TcpTimeClient
Private const portNum As Integer = 13
Private const hostName As String = "host.contoso.com"
' Entry point that delegates to C-style main Private Function.
Public Overloads Shared Sub Main()
System.Environment.ExitCode = _
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Public Shared Function Main(args() As [String]) As Integer
Try
Dim client As New TcpClient(hostName, portNum)
Dim ns As NetworkStream = client.GetStream()
Dim bytes(1024) As Byte
Dim bytesRead As Integer = ns.Read(bytes, 0, bytes.Length)
Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRead))
Catch e As Exception
Console.WriteLine(e.ToString())
End Try
client.Close()
Return 0
End Function 'Main
End Class 'TcpTimeClient
using System;
using System.Net.Sockets;
using System.Text;
public class TcpTimeClient {
private const int portNum = 13;
private const string hostName = "host.contoso.com";
public static int Main(String[] args) {
try {
TcpClient client = new TcpClient(hostName, portNum);
NetworkStream ns = client.GetStream();
byte[] bytes = new byte[1024];
int bytesRead = ns.Read(bytes, 0, bytes.Length);
Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));
client.Close();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
return 0;
}
}
TcpListener は、TCP ポートに着信する要求を監視し、要求が着信すると、クライアントへの接続を管理する Socket または TcpClient のいずれかを作成します。ポート上でのリッスンを有効にするには Start メソッドを使用し、無効にするには Stop メソッドを使用します。AcceptTcpClient メソッドは、着信した接続要求を受け入れ、TcpClient を作成して要求を処理しますが、AcceptSocket メソッドは、着信した接続要求を受け入れ、Socket を作成して要求を処理します。
TcpListener を使用して TCP のポート番号 13 を監視するネットワーク タイム サーバーを作成するコード例を次に示します。着信した接続要求が受け入れられると、このタイム サーバーは応答としてホスト サーバーの現在の日時を返します。
Imports System
Imports System.Net.Sockets
Imports System.Text
Public Class TcpTimeServer
Private const portNum As Integer = 13
' Entry point that delegates to C-style main Private Function.
Public Overloads Shared Sub Main()
System.Environment.ExitCode = _
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Public Shared Function Main(args() As [String]) As Integer
Dim done As Boolean = False
Dim listener As New TcpListener(portNum)
listener.Start()
While Not done
Console.Write("Waiting for connection...")
Dim client As TcpClient = listener.AcceptTcpClient()
Console.WriteLine("Connection accepted.")
Dim ns As NetworkStream = client.GetStream()
Dim byteTime As Byte() = _
Encoding.ASCII.GetBytes(DateTime.Now.ToString())
Try
ns.Write(byteTime, 0, byteTime.Length)
ns.Close()
client.Close()
Catch e As Exception
Console.WriteLine(e.ToString())
End Try
End While
listener.Stop()
Return 0
End Function 'Main
End Class 'TcpTimeServer
using System;
using System.Net.Sockets;
using System.Text;
public class TcpTimeServer {
private const int portNum = 13;
public static int Main(String[] args) {
bool done = false;
TcpListener listener = new TcpListener(portNum);
listener.Start();
while (!done) {
Console.Write("Waiting for connection...");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Connection accepted.");
NetworkStream ns = client.GetStream();
byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
try {
ns.Write(byteTime, 0, byteTime.Length);
ns.Close();
client.Close();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
listener.Stop();
return 0;
}
}