subprocess模块
可以帮你通过代码执行操作系统的终端命令
返回终端执行命令后的结果
通过popen类实例化出一个对象,再通过这个对象,默认的stdout,stderr参数,返回终端执行命令后得到的结果。
粘包问题
服务器第一次发送的数据,客户端无法精确的一次性接收完毕。
下一次发送的数据与上一次数据在一起了。
导致粘包问题的原因
- 无法预测对方需要接收的数据大小长度。
- 多次连续发送数据量小,并且时间间隔短的数据一次性打包发送。
TCP协议特性
TCP是一个流式协议,会将多次连续发送数据量小,并且时间间隔短的数据一次性打包发送。
解决粘包问题
让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据。
1. struct模块
必须先定义报头,发送报头,再发送真实数据。
# 传输端
message = '你要发送的信息'
# 打包压缩,获取报头,'i'可以把长度压缩成四个字节的数据传输
headers = struct.pack('i', len(mssage))
# 先发送头部
conn.send(headers)
result = '真实数据'
# 再发送真实数据
conn.send(result)
# 接收端
# 先获取数据报头
headers = client.recv(4)
# 解包,或者真实数据长度
data_len = struct.unpack('i', headers)[0] # (len, )
# 接收真实数据
data = client.recv(data_len)
UDP
UDP是一种传输协议。
- 不需要建立双向管道。
- 不会粘包。
- 客户端给服务器发送数据,不需要等待服务端返回接收成功。
- 数据容易丢失,不安全
- TCP:就好比在打电话
- UDP:就好比在发短信
SocketServer
python内置模块,可以简化socket套接字服务端的代码。
- 简化TCP与UDP服务端代码
- 必须创建一个类