qq聊天室课堂小结day27

subprocess模块

  1. 可以帮你通过代码执行操作系统的终端命令。
  2. 并返回终端执行命令后的结果。
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'))

粘包问题

服务端第一次发送的数据,客户端无法精确一次性接收完毕。

下一次发送的数据与上一次数据粘在在一起了。

  1. 无法预测对方需要接收的数据大小长度。
  2. 多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。

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是一种传输协议。

  1. 不需要建立双向管道。
  2. 不会粘包。
  3. 客户端给服务端发送数据,不需要等待服务端返回接收成功。
  4. 数据容易丢失,数据不安全。

​ TCP:就好比在打电话。

​ UDP:就好比在发短信。

SocketServer

python内置模块,可以简化socket套接字服务端的代码。

- 简化TCP与UDP服务端代码
- 必须要创建一个类

猜你喜欢

转载自www.cnblogs.com/shin09/p/11707453.html