zoukankan      html  css  js  c++  java
  • 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通讯进行一个讲解,简单入门可以,还有很多需要注意,比如需要加锁保护数据,使用队列等等方式对数据进行。再以后的文章中再补充。

  • 相关阅读:
    kubernetes资源清单之Deployment
    kubernetes资源配置之ReplicaSets
    kubernetes资源清单之pod
    采用kubeadm部署工具,部署kubernetes1.16.3
    Kubernetes介绍与核心组件
    Linux系统初始化脚本
    Linux awk命令 --三剑客老大
    Linux sed命令 -- 三剑客老二
    Makefile中代码写在同一行和分开几行写有什么区别?
    毕业啦!我要好好学习!!!
  • 原文地址:https://www.cnblogs.com/qq-375291943/p/10084093.html
Copyright © 2011-2022 走看看