subprocess模块
- 可以帮你通过代码执行操作系统的终端命令。
- 并返回终端执行命令后的结果。
import subprocess
cmd = input('cmd>>:')
obj = subprocess.Popen(
# cmd命令
cmd,
# Shell = True
shell = True,
# 返回正确结果参数
stdout = subprocess.PIPE,
# 返回错误结果参数
stderr = subprocess.PIPE
)
result = obj.stdout.read() + obj.stderr.read()
print(result.decode('gbk'))
粘包问题
服务端第一次发送的数据,客户端无法精确一次性接收完毕。
下一次发送的数据与上一次数据粘在在一起了。
- 无法预测对方需要接收的数据大小长度。
- 多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
TCP协议特性:
tcp是一个流式协议,会将多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
解决粘包问题
- struct模块
必须先定义报头,发送报头,再发送真实数据。
- 即想发送文件,又想发送文件的描述信息
客户端发送字典给服务端
send_dic = {
file_name:文件名
file_size:文件的真实长度 100000
}
# 通过json模块序列化成bytes数据
json_data = json.dumps(send_dic)
bytes_data = json_data.encode('utf-8') # bytes
# 先获取字典的报头
headers = struct.pack('i',len(byte_data))
# 服务端接收到字典,并接收文件的真实数据
UDP
UDP是一种传输协议。
- 不需要建立双向管道。
- 不会粘包。
- 客户端给服务端发送数据,不需要等待服务端返回接收成功。
- 数据容易丢失,数据不安全。
TCP:就好比在打电话。
UDP:就好比在发短信。
SocketServer
python内置模块,可以简化socket套接字服务端的代码。
- 简化TCP与UDP服务端代码
- 必须要创建一个类