网络编程二
subprocess模块
1.可以帮你通过代码执行操作系统的终端命令。
2.并返回终端执行命令后的结果。
import subprocess
cmd = input('cmd>>:') # dir
obj = subprocess.Popen(
# cmd命令
cmd,
# Shell=True
shell=True,
# 返回正确结果参数
stdout=subprocess.PIPE,
# 返回错误结果参数 error
stderr=subprocess.PIPE
)
result = obj.stdout.read() + obj.stderr.read()
print(result.decode('gbk'))
知识兔struct模块
是一个可以将很长的数据的长度,压缩成固定的长度的一个标记(数据报头)。
# 打包压缩
# i:模式,会将数据长度压缩成4个bytes
str1 = 'wataaaaaaaaaaaaa'
# 报头
# 模拟客户端
headers = struct.pack('i', 10000)
print(headers)
print(len(headers)) # 4
# client.send(headers)
# 模拟服务端
# headers = conn.recv(4)
data_len = struct.unpack('i', headers) # (10000,)
print(data_len[0]) # 真实数据长度10000
知识兔粘包问题
服务端第一次发送的数据,客户端无法精确一次性接受完毕。下一次发送的数据与上一次数据粘在一起了。
1.无法预测对方需要接受的数据大小长度。
2.多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
TCP协议特性:
tcp是一个流式协议,会将多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。
解决粘包问题:
truct模块
必须先定义报头,发送报头,再发送真实数据。
- 既想发送文件,又想发送文件的描述信息
# 客户端发送字典给服务端
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: 就好比在发短信。
知识兔SocketServer
python内置模块,可以简化socket套接字服务端的代码。
- 简化TCP与UDP服务端代码
- 必须要创建一个类