概要
A. 受信
1. Sockets.UdpClientのインスタンス作成
2. 受信用のエンドポイントを作成
3. 受信開始、受信した際のコールバックを作成
4. コールバックメソッド内で受信処理
B. 送信
1. Sockets.UdpClientのインスタンス作成
2. 送信用のエンドポイントを作成(送信元、送信先)
3. 送信後のコールバックを作成
4. コールバックメソッド内で送信終了処理
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<Window x:Class="UDPTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:UDPTest" mc:Ignorable="d" Title="MainWindow" Height="312" Width="236"> <Grid Margin="0,0,-8,0"> <Grid.ColumnDefinitions> <ColumnDefinition/> </Grid.ColumnDefinitions> <Button x:Name="bt_UDPListenStart" Content="受信開始" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="bt_UDPListenStart_Click"/> <TextBox x:Name="textBox_ReceivedMessage" Height="69" Margin="10,35,16,0" TextWrapping="Wrap" Text="受信メッセージ" VerticalAlignment="Top"/> <Button x:Name="bt_UDPdataSend" Content="送信" HorizontalAlignment="Left" Margin="10,109,0,0" VerticalAlignment="Top" Width="75" Click="bt_UDPdataSend_Click" /> <TextBox x:Name="textBox_SendMessage" Height="60" Margin="10,134,16,0" TextWrapping="Wrap" Text="送信メッセージ" VerticalAlignment="Top"/> <TextBox x:Name="textBox_Status" Height="60" Margin="10,211,16,0" TextWrapping="Wrap" Text="Status" VerticalAlignment="Top"/> </Grid> </Window> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
using System; using System.Windows; namespace UDPTest { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void bt_UDPListenStart_Click(object sender, RoutedEventArgs e) { try { // Sockets.UdpClientのインスタンス作成と // textbox等のセット Class_UDP udp = new Class_UDP(); udp.window = this; udp.textbox_Status = textBox_Status; udp.textbox_Receiver = textBox_ReceivedMessage; // 受信用IPアドレス、リスニングポート設定 string localIPstring = "127.0.0.1"; int localPortNum = 60001; // 受信開始 udp.ReceiveStart(localIPstring, localPortNum); // GUI更新 // ボタン無効 bt_UDPListenStart.IsEnabled = false; // テキストボックス初期化 textBox_ReceivedMessage.Text = ""; textBox_Status.Text = ""; } catch (Exception ex) { string message = ex.ToString(); MessageBox.Show(message); } } private void bt_UDPdataSend_Click(object sender, RoutedEventArgs e) { try { // Sockets.UdpClientのインスタンス作成と // textbox等のセット Class_UDP udp = new Class_UDP(); udp.window = this; udp.textbox_Status = textBox_Status; // 送信用IPアドレス、送信ポート設定 string localIPstring = "127.0.0.1"; int localPortNum = 50001; // 送信先IPアドレス、リスニングポート設定 string remoteIPstring = "127.0.0.1"; int remotePortNum = 60001; // GUI更新 // テキストボックス初期化 textBox_Status.Text = ""; // データ送信 udp.SendData(remoteIPstring, remotePortNum, localIPstring, localPortNum, textBox_SendMessage.Text); } catch (Exception ex) { string message = ex.ToString(); MessageBox.Show(message); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
using System; using System.Windows; using System.Windows.Controls; namespace UDPTest { class Class_UDP { public Window window { set; get; } public TextBox textbox_Status { set; get; } public TextBox textbox_Receiver { set; get; } public void ReceiveStart(string localIPString, int localPortNum) { try { System.Net.Sockets.UdpClient udpClient = null; System.Net.IPAddress localIPAddress = System.Net.IPAddress.Parse(localIPString); // エンドポイントを作成 // 接続元のIPアドレス、ポート番号を指定 System.Net.IPEndPoint localEP = new System.Net.IPEndPoint( localIPAddress, localPortNum); udpClient = new System.Net.Sockets.UdpClient(localEP); //非同期的なデータ受信を開始する udpClient.BeginReceive(ReceiveCallback, udpClient); } catch (Exception ex) { string message = ex.ToString(); MessageBox.Show(message); } } // --------------------------------------- private void ReceiveCallback(IAsyncResult ar) { System.Net.Sockets.UdpClient udp = (System.Net.Sockets.UdpClient)ar.AsyncState; try { //非同期受信を終了する System.Net.IPEndPoint remoteEP = null; byte[] rcvBytes; try { rcvBytes = udp.EndReceive(ar, ref remoteEP); } catch (System.Net.Sockets.SocketException ex) { window.Dispatcher.Invoke((Action)(() => { textbox_Receiver.AppendText($"受信エラー({ex.Message}/{ex.ErrorCode})"); })); //Console.WriteLine("受信エラー({0}/{1})", // ex.Message, ex.ErrorCode); return ; } catch (ObjectDisposedException ex) { //すでに閉じている時は終了 window.Dispatcher.Invoke((Action)(() => { textbox_Receiver.AppendText("Socketは閉じられています。"); })); //Console.WriteLine("Socketは閉じられています。"); return ; } //データを文字列に変換する var rcvMsg = System.Text.Encoding.UTF8.GetString(rcvBytes); window.Dispatcher.Invoke((Action)(() => { textbox_Receiver.AppendText(rcvMsg + Environment.NewLine); })); } catch (Exception ex) { string message = ex.ToString(); MessageBox.Show(message); } finally { //再びデータ受信を開始する udp.BeginReceive(ReceiveCallback, udp); } } // --------------------------------------- public void SendData(string remoteIPstring, int remotePortNum, string localIPstring, int localPortNum, string sendMessage) { // 送信用UdpClientを作成する System.Net.Sockets.UdpClient udpClientSender = null; try { // 接続元、接続先 IPアドレス、ポート番号 System.Net.IPAddress remoteIPaddress = System.Net.IPAddress.Parse(remoteIPstring); // 接続元、接続先 IPアドレス、ポート番号 System.Net.IPAddress localIPaddress = System.Net.IPAddress.Parse(localIPstring); // 接続ソケットの準備 System.Net.IPEndPoint localEndPoint = new System.Net.IPEndPoint(localIPaddress, localPortNum); System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPaddress, remotePortNum); //UdpClientを作成する if (udpClientSender == null) { udpClientSender = new System.Net.Sockets.UdpClient(localEndPoint); } //送信するデータを作成する byte[] sendBytes = new byte[] { }; sendBytes = System.Text.Encoding.UTF8.GetBytes(sendMessage); //非同期的にデータを送信する udpClientSender.BeginSend(sendBytes, sendBytes.Length, remoteEndPoint, SendCallback, udpClientSender); } catch (Exception ex) { string message = ex.ToString(); MessageBox.Show(message); } } // --------------------------------------- //データを送信した時 private void SendCallback(IAsyncResult ar) { System.Net.Sockets.UdpClient udp = (System.Net.Sockets.UdpClient)ar.AsyncState; //非同期送信を終了する try { udp.EndSend(ar); } catch (System.Net.Sockets.SocketException ex) { Console.WriteLine("送信エラー({0}/{1})", ex.Message, ex.ErrorCode); } catch (ObjectDisposedException ex) { //すでに閉じている時は終了 Console.WriteLine("Socketは閉じられています。"); } } } } |
コメント