如何在 C# 中使用 UdpClient class 时接收 UDP 包
How to receive UDP packages when using UdpClient class in C#
我正在尝试编写一个可以与我的 Node.js 服务器通信的图形 C# 程序。
我正在使用 UdpClient class,我可以向服务器发送一些消息。
但是,我不知道如何从服务器接收UDP包。
JavaScript 和 Windows Form Widgets 是事件驱动的,但 C# 中的 UdpClient class 没有任何方便的与数据接收相关的事件。
另外,我不知道包裹接收代码放在哪里。大多数在线示例都是控制台程序,而我的程序是基于 GUI 的。
我希望我的程序持续监听一个端口,当一个包进来时,程序可以捕获包并将其内容显示在一个文本框中。
有什么建议吗?
您可以使用 BeginReceive
异步侦听端口。它也适用于 GUI 应用程序 - 请记住在与 UI.
交互之前将数据发送到 UI 线程
此示例来自 WinForms 应用程序。我在名为 txtLog
.
的表单上放置了一个多行文本框
private const int MyPort = 1337;
private UdpClient Client;
public Form1() {
InitializeComponent();
// Create the UdpClient and start listening.
Client = new UdpClient(MyPort);
Client.BeginReceive(DataReceived, null);
}
private void DataReceived(IAsyncResult ar) {
IPEndPoint ip = new IPEndPoint(IPAddress.Any, MyPort);
byte[] data;
try {
data = Client.EndReceive(ar, ref ip);
if (data.Length == 0)
return; // No more to receive
Client.BeginReceive(DataReceived, null);
} catch (ObjectDisposedException) {
return; // Connection closed
}
// Send the data to the UI thread
this.BeginInvoke((Action<IPEndPoint, string>)DataReceivedUI, ip, Encoding.UTF8.GetString(data));
}
private void DataReceivedUI(IPEndPoint endPoint, string data) {
txtLog.AppendText("[" + endPoint.ToString() + "] " + data + Environment.NewLine);
}
我正在尝试编写一个可以与我的 Node.js 服务器通信的图形 C# 程序。
我正在使用 UdpClient class,我可以向服务器发送一些消息。
但是,我不知道如何从服务器接收UDP包。 JavaScript 和 Windows Form Widgets 是事件驱动的,但 C# 中的 UdpClient class 没有任何方便的与数据接收相关的事件。
另外,我不知道包裹接收代码放在哪里。大多数在线示例都是控制台程序,而我的程序是基于 GUI 的。
我希望我的程序持续监听一个端口,当一个包进来时,程序可以捕获包并将其内容显示在一个文本框中。
有什么建议吗?
您可以使用 BeginReceive
异步侦听端口。它也适用于 GUI 应用程序 - 请记住在与 UI.
此示例来自 WinForms 应用程序。我在名为 txtLog
.
private const int MyPort = 1337;
private UdpClient Client;
public Form1() {
InitializeComponent();
// Create the UdpClient and start listening.
Client = new UdpClient(MyPort);
Client.BeginReceive(DataReceived, null);
}
private void DataReceived(IAsyncResult ar) {
IPEndPoint ip = new IPEndPoint(IPAddress.Any, MyPort);
byte[] data;
try {
data = Client.EndReceive(ar, ref ip);
if (data.Length == 0)
return; // No more to receive
Client.BeginReceive(DataReceived, null);
} catch (ObjectDisposedException) {
return; // Connection closed
}
// Send the data to the UI thread
this.BeginInvoke((Action<IPEndPoint, string>)DataReceivedUI, ip, Encoding.UTF8.GetString(data));
}
private void DataReceivedUI(IPEndPoint endPoint, string data) {
txtLog.AppendText("[" + endPoint.ToString() + "] " + data + Environment.NewLine);
}