今日内容:
- subprocess模块
- 粘包问题
服务端第一次发送的数据,客户端无法精确一次性接受完毕。
下一次发送的数据与上一次数据粘在一起了。
1.无法预测对方需要接受的数据大小长度。
2.多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
TCP协议特性:
tcp是一个流式协议,会将多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
- 解决粘包问题:
- struct模块
必须先定义报头,发送报头,再发送真实数据。
- 既想发送文件,又想发送文件的描述信息
# 客户端发送字典给服务端
send_dic = {
file_name: 文件名
file_size: 文件的真实长度 1000000
}
# 通过json模块序列化成bytes数据
json_data = json.dumps(send_dic)
bytes_data = json_data.encode('utf-8') # bytes
# 先获取字典的报头
headers = struct.pack('i', len(bytes_data))
# 服务端接收到字典,并接收文件的真实数据
- 上传大文件
客户端往服务端上传大文件
- UDP
UDP是一种传输协议。
1)不需要建立双向管道。
2)不会粘包
3)客户端给服务端发送数据,不需要等待服务端返回接收成功
3)数据容易丢失,数据不安全。
- TCP: 就好比在打电话。
- UDP: 就好比在发短信。
- QQ聊天室
- SocketServer
python内置模块,可以简化socket套接字服务端的代码。
- 简化TCP与UDP服务端代码
- 必须要创建一个类