使用python实现UDP编程

【使用python实现UDP编程】原创: 志学Python 志学Python
UDP的生动理解
UDP说自己太难了 , 没想到最后是一个舔狗 。一般我们讲技术的时候 , 都是讲太多理论 , 搞得我们一脸懵逼 , 今天我们不这样做 , 我们直接讲一个生动的例子来讲讲 UDP
听好了 , 有一天 , 丑男喜欢上一个美女了 , 并开始展开了死皮赖脸的的追求 , 他通过身边的人搞到了美女的微信 , QQ , 每天都给美女发信息 , 不管美女在不在线 , 每天都给美女买吃的 , 美女却什么也不恢复 , 不拒绝 , 就像懒蛤蟆想吃天鹅肉一样 , 每天必舔一遍 , 最后发现美女一直吃着自己送给她的东西 , 跟着另外一个男人跑了 , 舔狗发出了惨叫声 , 我太难了 , 最后死于非命 。
使用python实现UDP编程

文章插图
 
例子仅仅是例子 , 是生动了一些 , 但是这样我们更有画面感 , 更有动力学习了 , 为什么最后UDP变成了舔狗了呢?原来是这样的 , UDP在网络通信方面是无链接状态的 , 就好比舔狗发消息 , 美女不一定在线 , 不一定收得到 , 或许他的QQ , 微信都是小号 , 哈哈 , 太给力了 。是不需要确定对方能不能收到 , 直接发 , 不用建立连接 。QQ发送信息也是通过UDP协议 , 不用担心收不到信息 。
说了这么多 , 我们还是上图比较明确一点 , 首先解释一下 , 要当舔狗(client端) , 必须要到对方(server端)的正确的QQ号 , 微信号 , 手机号 , 这就相当于网络中的IP , 端口号一样 , 只有绑定了这些东西 , 才能发送东西 。
 
使用python实现UDP编程

文章插图
 
 
UDP 特性
  • UDP 对数据的安全性 , 是否完整顺序到底对方 , 对方是否接手没有严格要求 , 继承IP特性
  • UDP 是面向无连接的 , 就像我们寄快递一样 , 我们只要把我们的送达地址写好 , 至于采用什么快递都无所谓
  • UDP 是一个一个的发 , 一个一个的收 , 数据格式基于数据报(包含报头以及数据本身)
  • UDP 是应用需要发 , 就会发送 , 不处理堵塞(不要把处理UDP程序写在主线程里面)
应用场景
  • 广播和多播应用必须使用UDP , 也就是 一对多的情况
  • 简单的请求-应答应用程序可以使用UDP , 对数据流 , 丢不丢包都没关系 , 就可以使用UDP
  • 对于海量数据传输不应该使用UDP , 对数据传输比较严格
  • DNS、NFS、流媒体传输等等
python 实现 UDP
首先是我们的 server.py
#coding:utf-8from socket import *from time import ctimeprint("=====================时间戳UDP服务器=====================")HOST = '' #主机号为空白表示可以使用任何可用的地址 。PORT = 28888 #端口号BUFSIZ = 1024 #接收数据缓冲大小ADDR = (HOST, PORT)udpSerSock = socket(AF_INET, SOCK_DGRAM) #创建udp服务器套接字udpSerSock.bind(ADDR) #套接字与地址绑定while True: print('等待接收消息...') data, addr = udpSerSock.recvfrom(BUFSIZ) #连续接收指定字节的数据 , 接收到的是字节数组 udpSerSock.sendto(bytes('[%s] %s' % (ctime(), data.decode('utf-8')), 'utf-8'), addr) #向客户端发送时间戳数据 , 必须发送字节数组 print('响应消息到', addr)udpSerSock.close() #关闭服务器socket接下来是我们的 client.py
#coding:utf-8from socket import *print("=====================UDP客户端=====================")HOST = '127.0.0.1' #本机测试PORT = 28888 #端口号BUFSIZ = 1024 #接收消息的缓冲大小ADDR = (HOST, PORT)udpCliSock = socket(AF_INET, SOCK_DGRAM) #创建客户端套接字while True: data = input('> ') #接收用户输入 if not data: #如果用户输入为空 , 直接回车就会发送"" , ""就是代表false break udpCliSock.sendto(bytes(data,'utf-8'), ADDR) #客户端发送消息 , 必须发送字节数组 data, ADDR = udpCliSock.recvfrom(BUFSIZ) #接收回应消息 , 接收到的是字节数组 if not data: #如果接收服务器信息失败 , 或没有消息回应 break print(str(data,'utf-8')) #打印回应消息udpCliSock.close()#关闭客户端socket


推荐阅读