Python Day32:UDP协议、UDP与TCP协议的区别、以及其服务端、客户端标准代码

## 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]的一条消息:\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()

```

猜你喜欢

转载自www.cnblogs.com/huhongpeng/p/10960234.html