C#之UDP通信

简介

C#中的udp通信关键类:Udpclient,它位于命名空间System.Net.Sockets中,发送接收都是UdpClient类,

命名空间

using System.Net.Sockets;
using System.Net;
using System.Net.NetworkInformation;
using System.Management;

发送数据

1.Visual C# UdpClient类发送UDP数据包:
在具体使用中,一般分成二种情况:

(1).知道远程计算机IP地址:
"Send"方法的调用语法如下:
参数说明:
dgram 要发送的 UDP 数据文报(以字节数组表示)。
bytes 数据文报中的字节数。
endPoint 一个 IPEndPoint,它表示要将数据文报发送到的主机和端口。
返回值 已发送的字节数。
下面使用UdpClient发送UDP数据包的具体的调用例子:

(2).知道远程计算机名称:
知道远程计算机名称后,利用"Send"方法直接把UDP数据包发送到远程主机的指定端口号上了,这种调用方式也是最容易的,语法如下:
参数说明:
dgram 要发送的 UDP 数据文报(以字节数组表示)。
bytes 数据文报中的字节数。
hostname 要连接到的远程主机的名称。
port 要与其通讯的远程端口号。
返回值 已发送的字节数。

附上发送数据代码如下:

	private void btnSend_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(SendMsg);
        t.IsBackground = true;
        t.Start(sendText.Text);
       
    }

	private void SendMsg( object obj )
    {
        string message = (string)obj;
        SendClient = new UdpClient(0);
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(message);
        remoteIp = IPAddress.Parse(remoteIPBox.Text);
        IPEndPoint iep = new IPEndPoint(remoteIp,portSend);
        try
        {
            SendClient.Send(bytes, bytes.Length, iep);
            AddItem(listBoxstatus, string.Format("向{0}发送:{1}", iep, message));  //异步委托显示数据
            clearTextBox();
        }
        catch(Exception ex)
        {
            AddItem(listBoxstatus,"发送出错"+ex.Message);
        }
    }

接收数据

2.Visual C# UdpClient类接收UDP数据包:
接收UDP数据包使用的是UdpClient中的“Receive"方法。
参数说明:
remoteEP 是一个 IPEndPoint类的实例,它表示网络中发送此数据包的节点。

附上接收数据的代码如下:

	private void FormChat_Load(object sender, EventArgs e)
    {
        //创建接收线程
        Thread RecivceThread = new Thread(RecivceMsg);
        RecivceThread.IsBackground = true;
        RecivceThread.Start();
        sendText.Focus();
    }

    private void RecivceMsg()
    {
        IPEndPoint local = new IPEndPoint(ip,portRecv);
        RecviceClient = new UdpClient(local);

        IPEndPoint remote = new IPEndPoint(IPAddress.Any, portSend);
        while (true)
        {
            try
            {
                byte[] recivcedata =  RecviceClient.Receive(ref remote);
                string strMsg = Encoding.ASCII.GetString(recivcedata, 0, recivcedata.Length);
                AddItem(listBoxRecv, string.Format("来自{0}:{1}", remote, strMsg));
            }
            catch
            {
                break;
            }
        }
    }

细节注意

1、在Winfrom框架下,在多线程中进行控件操作,就需要使用异常委托方式解决。

2、使用同一台计算机进行调试,ip设置统一,即为:127.0.0.1,端口号不同。

总结

该文章简单对C#的UDP通讯进行一个讲解,简单入门可以,还有很多需要注意,比如需要加锁保护数据,使用队列等等方式对数据进行。再以后的文章中再补充。

原文地址:https://www.cnblogs.com/qq-375291943/p/10084093.html