在C#中使用UdpClient类时如何接收UDP包

时间:2015-04-12 11:17:14

标签: c# .net udpclient

我正在尝试编写一个可以与Node.js服务器通信的图形化C#程序。

我正在使用UdpClient类,我可以向服务器发送一些消息。

但是,我不知道如何从服务器接收UDP包。 JavaScript和Windows窗体小部件是事件驱动的,但C#中的UdpClient类没有任何与数据接收相关的方便事件。

另外,我不知道在哪里放置包裹接收代码。大多数在线示例都是控制台程序,我的程序是基于GUI的。

我希望我的程序能够在端口上连续监听,当程序包进入时,程序可以捕获程序包并在TextBox中显示其内容。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用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);
}