## UDP协议 UDP通讯流程图 ## ![image-20181206164635501](https://ws4.sinaimg.cn/large/006tNbRwly1fxx4ditf86j30fp0a6q3u.jpg) ```python udp是无链接的,先启动哪一端都不会报错,即使对方地址根本不存在也不会报错,强制关闭任何一方也没有任何问题,另外,由于无连接的特点,服务器不需要针对摸个客户端进行循环,只要循环的接收即可,谁发来的消息都可以被处理 ``` ## UDP和TCP区别: ```python TCP: 建立连接:三次握手。 可靠得数据传输,发送方没有收到接收方确认收到得消息,重复发送至报错 数据发送是基于字节流的、有拥塞控制的 会发生粘包 只能一对一通信 UDP:不需要建立连接,绑定id/端口号直接发送。 不可靠传输,不管接受方是否收到信息。 数据发送是基于包的,没有拥塞控制 不会发生粘包,数据包有明确界限。 支持一对一、一对多、多对多交互通讯 TCP适用于,需要确保数据安全、完整到达得,比如支付、文本传输等 UDP适用于,需要实时、传输效率高的场景,比如视频通话、游戏。 ``` ## UDP服务端 ```python import socket ip_port=('127.0.0.1',8081) udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #买手机 udp_server_sock.bind(ip_port) while True: qq_msg,addr=udp_server_sock.recvfrom(1024) print('来自[%s:%s]的一条消息: 33[1;44m%s 33[0m' %(addr[0],addr[1],qq_msg.decode('utf-8'))) back_msg=input('回复消息: ').strip() udp_server_sock.sendto(back_msg.encode('utf-8'),addr) ``` ## UDP客户端 ```python import socket BUFSIZE=1024 udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) qq_name_dic={ '狗哥':('127.0.0.1',8081), '天线宝宝':('127.0.0.1',8081), '巴拉巴拉小魔女':('127.0.0.1',8081), '王尼玛':('127.0.0.1',8081), } while True: qq_name=input('请选择聊天对象: ').strip() while True: msg=input('请输入消息,回车发送: ').strip() if msg == 'quit':break if not msg or not qq_name or qq_name not in qq_name_dic:continue udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name]) back_msg,addr=udp_client_socket.recvfrom(BUFSIZE) print('来自[%s:%s]的一条消息: 33[1;44m%s 33[0m' %(addr[0],addr[1],back_msg.decode('utf-8'))) udp_client_socket.close() ```