## UDP协议
UDP通讯流程图
## 
```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]的一条消息:\033[1;44m%s\033[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]的一条消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
udp_client_socket.close()
```