UDP通信 (1)

 Metro Style App でLAN上のサーバーと通信する方法について調べてみました。
 今回調べたのは UDP での通信についてです。

 まずは、確認用にデスクトップアプリで UDP 通信を行うクライアント/サーバーを作成します。

 最初に作成するのはサーバーです。
 UDP で文字列を受信し、頭に"Echo : "を付けた形で返信する機能を実装します。

public partial class Form1 : Form
{
    UdpClient client;

    public Form1()
    {
        InitializeComponent();
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        client = new UdpClient(11111);
        client.EnableBroadcast = true;

        try
        {
            for (; ; )
            {
                var result = await client.ReceiveAsync();

                var str = Encoding.UTF8.GetString(result.Buffer);
                Debug.WriteLine("EndPoint = {0} / Receive = {1}", result.RemoteEndPoint.Address.ToString(), str);

                var data = Encoding.UTF8.GetBytes("Echo : " + str);
                await client.SendAsync(data, data.Length, result.RemoteEndPoint);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        client.Close();
    }
}

 このアプリは外部からの受信を待機する形になりますので、ファイアーウォールで通信を許可する必要があります。
 通常は最初に起動した時に通信を許可するか聞かれますので、その時に許可します。

 サーバーがちきんと動作しているか確認するために、クライアント側も作成します。

 クライアントは TextBox に文字列を入力して Send ボタンを押すと、文字列をサーバーに送信し、サーバーから戻ってきた文字列を画面に表示します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void sendButton_Click(object sender, EventArgs e)
    {
        var client = new UdpClient();
        client.EnableBroadcast = true;

        var data = Encoding.UTF8.GetBytes(sendTextBox.Text);

        var endpoint = new IPEndPoint(IPAddress.Broadcast, 11111);
        int rtn = await client.SendAsync(data, data.Length, endpoint);

        var result = await client.ReceiveAsync();
        var str = Encoding.UTF8.GetString(result.Buffer);

        recvTextBox.Text = str;

        client.Close();
    }
}

 クライアント、サーバー両方を起動し、クライアントから送信してみた結果が以下の画面です。

 送受信が動作している事がわかりました。
 次回は、クライアントの Metro Style App 版を作成します。