基于udp协议的套接字
tcp:发送数据可靠,需要建立连接,存在粘包现象
udp:传送数据不可靠,不用建立连接,发数据效率高,不存在粘包现象
服务端
from socket import * server = socket(AF_INET, SOCK_DGRAM) # 数据报协议,没有粘包问题 server.bind("127.0.0.1", 8080) # udp 没有连接无listen和accept while True: data, client_addr = server.recvfrom(1024) # 收消息 print(data) server.sendto(data.upper(), client_addr) # 回消息 server.close()
客户端
from socket import * client = socket(AF_INET, SOCK_DGRAM) # 数据报协议,没有粘包问题 # udp 没有连接无listen和accept while True: msg = input(">>>:").strip() # tcp不能为空,udp可以发空内容 client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080)) # 发送 data, server_addr = client.recvfrom(1024) # 再发回消息 print(data, server_addr) client.close() # sendto 和 recvfrom 一一对应
TCP VS UDP
tcp基于链接通信
- 基于链接,则需要listen(backlog),指定连接池的大小
- 基于链接,必须先运行的服务端,然后客户端发起链接请求
- 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
- 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
- 流式协议 会粘包 不可以发空 send recv 不是 一 一对应
- tcp适用于:
- 数据一定要可靠
- 远程执行命令
- 下载文件
udp无链接
- 无链接,因而无需listen(backlog),更加没有什么连接池之说了
- 无链接,udp的sendto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
- recvfrom收的数据小于sendto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
- 只有sendto发送数据没有recvfrom收数据,数据丢失
- 数据报协议 不会粘包 可以发空 sendto recvfrom 一 一 对应 数据报协议 数据不安全 有可能发送数据 > 1024 或者网络网络异常 数据没了
- udp适用于
- 查询操作 eg: ntp时间服务器 dns服务器(查域名,转ip) 能保证查询效率高,数据虽然不可靠