C# Language
ネットワーキング
サーチ…
構文
- TcpClient(文字列ホスト、intポート);
備考
client.GetStream()
からclient.GetStream()
をTcpClient
してNetworkStream
を取得し、 StreamReader/StreamWriter
にStreamReader/StreamWriter
て、非同期の読み書きメソッドにアクセスすることができます。
基本的なTCP通信クライアント
このコード例は、TCPクライアントを作成し、ソケット接続を介して "Hello World"を送信し、接続を閉じる前にサーバー応答をコンソールに書き込みます。
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
using (var _client = new TcpClient(host, port))
using (var _netStream = _client.GetStream())
{
_netStream.ReadTimeout = timeout;
// Write a message over the socket
string message = "Hello World!";
byte[] dataToSend = System.Text.Encoding.ASCII.GetBytes(message);
_netStream.Write(dataToSend, 0, dataToSend.Length);
// Read server response
byte[] recvData = new byte[256];
int bytes = _netStream.Read(recvData, 0, recvData.Length);
message = System.Text.Encoding.ASCII.GetString(recvData, 0, bytes);
Console.WriteLine(string.Format("Server: {0}", message));
};// The client and stream will close as control exits the using block (Equivilent but safer than calling Close();
Webサーバーからファイルをダウンロードする
インターネットからファイルをダウンロードすることは、あなたが構築しようとするほとんどのアプリケーションで必要とされる非常に一般的な作業です。
これを実現するには、 " System.Net.WebClient "クラスを使用します。
これを「使用する」パターンを使用して最も簡単に使用する方法を以下に示します。
using (var webClient = new WebClient())
{
webClient.DownloadFile("http://www.server.com/file.txt", "C:\\file.txt");
}
この例では、「使用」を使用して、完了したらWebクライアントが正しくクリーンアップされたことを確認し、最初のパラメータのURLから指定されたリソースをローカルハードドライブの2番目のファイルパラメータ。
最初のパラメータは " System.Uri "型で、2番目のパラメータは " System.String "型です。
また、この関数を非同期形式で使用することもできます。これにより、バックグラウンドでダウンロードが実行され、アプリケーションは何か他のものとやりとりされます。このような呼び出しを使用することは、現代のアプリケーションでは重要ですユーザーインターフェイスの応答性を維持します。
Asyncメソッドを使用すると、進行状況を監視できるようにするイベントハンドラを接続することができます。たとえば、次のような進行状況バーを更新できます。
var webClient = new WebClient())
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync("http://www.server.com/file.txt", "C:\\file.txt");
しかし、Asyncのバージョンを使用している場合の覚えておくべき重要な点の1つは、「使用構文」でそれらを使用することに非常に注意してください。
この理由は非常に簡単です。ダウンロードファイルメソッドを呼び出すとすぐに戻ります。これを使用ブロックに入れている場合は、そのブロックを終了してすぐにクラスオブジェクトを破棄して、進行中のダウンロードをキャンセルします。
非同期転送を実行するために「使用する」方法を使用する場合は、転送が完了するまで囲みブロック内にとどまるようにしてください。
非同期TCPクライアント
C#アプリケーションでasync/await
を使用すると、マルチスレッドが簡単になります。これは、 async/await
をTcpClientとともに使用する方法です。
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
// Then get the netstream and pass it
// To our StreamWriter and StreamReader
using (var client = new TcpClient())
using (var netstream = client.GetStream())
using (var writer = new StreamWriter(netstream))
using (var reader = new StreamReader(netstream))
{
// Asynchronsly attempt to connect to server
await client.ConnectAsync(host, port);
// AutoFlush the StreamWriter
// so we don't go over the buffer
writer.AutoFlush = true;
// Optionally set a timeout
netstream.ReadTimeout = timeout;
// Write a message over the TCP Connection
string message = "Hello World!";
await writer.WriteLineAsync(message);
// Read server response
string response = await reader.ReadLineAsync();
Console.WriteLine(string.Format($"Server: {response}"));
}
// The client and stream will close as control exits
// the using block (Equivilent but safer than calling Close();
基本的なUDPクライアント
このコード例では、UDPクライアントを作成し、ネットワーク上で意図した受信者に "Hello World"を送信します。 UDPはコネクションレスなので、リスナーはアクティブである必要はなく、無関係にメッセージをブロードキャストします。メッセージが送信されると、クライアントの作業が完了します。
byte[] data = Encoding.ASCII.GetBytes("Hello World");
string ipAddress = "192.168.1.141";
string sendPort = 55600;
try
{
using (var client = new UdpClient())
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), sendPort);
client.Connect(ep);
client.Send(data, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
以下は、上記のクライアントを補完するUDPリスナの例です。これは、常に一定のポート上にあるトラフィックを待ち受け、そのデータをコンソールに書き込むだけです。この例には、内部で設定されていない制御フラグ ' done
'が含まれており、これを設定してリスナーの終了と終了を許可するものがあります。
bool done = false;
int listenPort = 55600;
using(UdpClinet listener = new UdpClient(listenPort))
{
IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
while(!done)
{
byte[] receivedData = listener.Receive(ref listenPort);
Console.WriteLine("Received broadcast message from client {0}", listenEndPoint.ToString());
Console.WriteLine("Decoded data is:");
Console.WriteLine(Encoding.ASCII.GetString(receivedData)); //should be "Hello World" sent from above client
}
}