《如何通俗的讲解UDP基础知识》
为了让大家都能看懂,代码我尽量注释,让大家能知其然也知其所以然。
![87f124316c30576d956d6305250696b4.gif](https://i-blog.csdnimg.cn/blog_migrate/53819db2bece4a78528bcd60c2f5cce2.gif)
上一篇我们讲到UDP本质上就是设备之间的数据传输协议,按照一定的规范,设置好对应的信息,把数据发送出去,然后再按照规定好的格式进行接收和解析。
实现流程如下:
1. 创建socket,并绑定IP地址和端口号
2. 把数据塞到receive()/send()方法中
3. 关闭socket
是不是很简单,是不是和把大象装冰箱的步骤几乎雷同!![c65862154d8e2bb61cfeb93269c0e8c6.png](https://i-blog.csdnimg.cn/blog_migrate/ce7a8ba745c425d949f7276ee4dc46d1.jpeg)
这里我们画一下socket的通信过程
![27343f97e55062cbba45b263f4e23038.png](https://i-blog.csdnimg.cn/blog_migrate/6ee442c5a38ade92cc6661368f16102e.jpeg)
如果要说的稍微详细一点的话
![a41d52ccfd3135ab389af5b70c59daf3.png](https://i-blog.csdnimg.cn/blog_migrate/9e07267b5773d2a05930d7ff74ee8e04.jpeg)
由上图可知建立socket通讯我们需要创建一个服务器端,一个客户端,通俗点儿说就是交流需要两个对象,一个巴掌拍不响。
![cbaea6028cf4f99b392af7004b032fea.png](https://i-blog.csdnimg.cn/blog_migrate/1302b4990b4bd546c633b15aa96c5445.jpeg)
没接触过通讯知识的朋友们是不是觉得上面的知识有点小复杂,看不懂没关系,根本不影响咱们写代码!甚至这篇文章你没一个字看得懂都不打紧,只要你会 Control C + Control V, 你就可以当程序猿!因为我们码农的工作实质就是:
下面我们就用C#语言实现试试看!
① 创建一个socket
Socket newsock = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Socket方法的这三个参数分别代表什么含义呢?
AddressFamily:指定 Socket 类的实例可以使用的寻址方案,暂时不用管。SocketType :指定 Socket 类的实例表示的套接字的类型,暂时不用管。
ProtocolType:就是字面意思,协议类型,后面讲TCP和抓包的时候会用上别的协议,这里不管。
你可能会问,那既然什么都不用管,小编写出来干啥呢? 我不是怕你不放心么!那既然这些参数都不用改,我们不写可不可以?那当然也是可以的。这里C#专门有一个UdpClient类来方便大家偷懒。 UdpClient client = new UdpClient(远程端点); 因为UDP属于无 连接通信,意思就是通信的时候不用先给服务器打招呼,就只顾自己往外发数据,别人收不收得到根本不care,同时别人收到数据了也不会反馈。 尽管UdpClient这个类叫Client,我们也 可以用其创建服务器端程序。② 实例化一个远程端点
意思就是要指定IP地址和端口号,比如:
IPEndPoint remotePoint = new IPEndPoint ( IPAddress .Parse ("127.0.0.1"), 5555);这里“127.0.0.1”就是本机的IP地址,就是让计算机自己发给自己。
③ 发送/接收数据
发送:
client.Send(sendData, sendData.Length, remotePoint);
接收:
receiveData = client.Receive(ref remotePoint);
④ 关闭socket
client.Close();
没了,核心代码就不超过5行!理解了这5行就能实现UDP的收发了。那我为啥啰啰嗦嗦说这么一大堆呢,因为只有理解了理论知识,大家才不会局限于编程语言,有时间我会给大家讲讲C/C++, Matlab/Simulink, Python不同语言中,UDP收发是怎么实现的。大家可以猜猜看哪种方式最简单。
那我们把所有代码都写出来
服务器端:
客户端:
测试结果:
大家都可以自己试试,下次有时间统一上传一下源代码。
![0dd2f25bd48e196c97906dd19c2b537e.gif](https://i-blog.csdnimg.cn/blog_migrate/f8162146ed04e9256e7bb80cafc30208.gif)