C# で Socket 通信 を行う 方法 (UDP 通信 with UdpClient)

0 件のコメント

Socket を利用した通信で UDP 送受信 を行う サンプルコード を掲載します。 ここでは UDP通信 でも UdpClient クラス を用いた 同期処理 および 非同期処理 の サンプルコード を掲載します。

目次

UDP 同期 送受信

UDP 同期 通信 は UDP 通信 の基本操作になります。 非同期化したければ、このメソッドごと Task.Factory.StartNew してしまうのも方法だと思います。 …途中で停止させる実装は別途必要ですが。。

UDP 同期 受信 (サーバー)

UdpClient クラス を利用して、 同期 で メッセージを受信する サンプルコード を掲載します。 同期処理なので重たい処理 (11行目 Receive メソッド) で処理が止まったような挙動になることに注意します。

public void ListenMessage()
{
    // 接続ソケットの準備
    var local = new IPEndPoint(IPAddress.Any, 8000);
    var remote = new IPEndPoint(IPAddress.Any, 8000);
    var client = new UdpClient(local);

    while (true)
    {
        // データ受信待機
        var buffer = client.Receive(ref remote);

        // 受信したデータを変換
        var data = Encoding.UTF8.GetString(buffer);

        // Receive イベント を実行
        this.OnRecieve(data);
    }
}

private void OnRecieve(string data)
{
    // 受信したときの処理
}

UDP 同期 送信 (クライアント)

UdpClient クラス を利用して、 同期 で メッセージを送信する サンプルコード を掲載します。 同期処理なので重たい処理 (14行目 Send メソッド) で処理がとまったような挙動になることに注意します。

UDP は コネクションレス なので、事前に接続先と接続を確立する必要はありませんが… Send メソッド の引数に接続先を指定しない場合、事前に Connect メソッド を呼ぶ必要があります。 逆に、Send メソッド の引数に接続先を指定する場合、Connect メソッド を呼ぶ必要はありません。

public void SendMessage()
{
    // 宛先の作成
    var remote = new IPEndPoint(
                        IPAddress.Parse("192.168.0.100"),
                        8000);

    // メッセージの準備
    var message = Encoding.UTF8.GetBytes("Hello world !");

    // UDPでメッセージ送信
    var client = new UdpClient(8000);      // ローカルポート番号を指定。
    client.Connect(remote);                // 接続先を設定。
    client.Send(message, message.Length);  // 同期処理なので、送信し終わるまで処理が止まる。
    client.Close();
}

UDP 非同期 送受信

UDP 非同期 受信 (サーバー)

UdpClient クラス を利用して、 非同期 で メッセージを受信する サンプルコード を掲載します。

public async void ListenMessage()
{
    // 接続ソケットの準備
    var local = new IPEndPoint(IPAddress.Any, 8000);
    var remote = new IPEndPoint(IPAddress.Any, 8000);
    var client = new UdpClient(local);

    while (true)
    {
        // データ受信待機
        var result = await client.ReceiveAsync();

        // 受信したデータを変換
        var data = Encoding.UTF8.GetString(result.Buffer);

        // Receive イベント を実行
        this.OnRecieve(data);
    }
}

private void OnRecieve(string data)
{
    // 受信したときの処理
}

UDP 非同期 送信 (クライアント)

UdpClient クラス を利用して、 非同期 で メッセージを送信する サンプルコード を掲載します。

public async void SendMessage()
{
    // 宛先の作成
    var remote = new IPEndPoint(
                        IPAddress.Parse("192.168.0.10"),
                        8000);

    // メッセージの準備
    var message = Encoding.UTF8.GetBytes("Hello world !");

    // UDPでメッセージ送信
    var client = new UdpClient(8000);
    client.Connect(remote);
    await client.SendAsync(message, message.Length);
    client.Close();
}

参考記事