UDP通信 (2)
前回作成したサーバーに対して送信を行う Metro Style App を作成します。
機能はデスクトップアプリ版と同じです。
デスクトップ版で使用していた UdpClient クラスは使えませんので DatagramSocket クラスを使用します。
MessageReceived イベントに受信した時の処理を登録した後で、送信用のストリームを取得して送信データを書き込みます。
サーバーから受信したら、データを取り出して TextBox に設定します。
なお、data というバイト配列に対して AsBuffer というメソッドを呼び出していますが、これは byte[] を IBuffer に変換する物です。
using で System.Runtime.InteropServices.WindowsRuntime 追加していないと使えませんので注意して下さい。
private async void sendButton_Click(object sender, RoutedEventArgs e) { var socket = new DatagramSocket(); socket.MessageReceived += socket_MessageReceived; var endpoint = new EndpointPair(null, "", new HostName("255.255.255.255"), "11111"); var stream = await socket.GetOutputStreamAsync(endpoint); var data = Encoding.UTF8.GetBytes(sendText.Text); var operation = await stream.WriteAsync(data.AsBuffer()); } void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) { var reader = args.GetDataReader(); var data = reader.DetachBuffer().ToArray(); var str = Encoding.UTF8.GetString(data, 0, data.Length); Dispatcher.Invoke(CoreDispatcherPriority.Normal, (s, a) => recvText.Text = str, this, null); reader.Dispose(); sender.Dispose(); }
前回作成したサーバーを起動した状態で、実行してみた結果が以下の画面です。
きちんと通信できているようです。
なお、Metro Style App でこのような通信を行う場合は、マニフェストの"機能"で"インターネット(クライアント)"を有効にしておく必要があります。
通常はアプリ作成時に有効になっているようなので、特に設定は必要ないと思います。
この設定がオフになっていると、通信系の処理で例外が発生します(今回のアプリだと GetOutputStreamAsync で UnauthorizedAccessException が発生します)。