黏包:
基于tcp先执行一个远程行命令的程序:
subprocess模块:
import subprocess res=subprocess.Popen("dir", shell=True, # 终端错误 stderr=subprocess.PIPE, #标准 错误 stdout=subprocess.PIPE #终端标准输出 ) print(res.stdout.read().decode("gbk"))
查看在当前目录下的所有内容
程序的结果的编码是以当前所在的系统为准的,Windows,res.stdout.read()读出来的是gbk,在接收端使用gbk解码,且只能从管道里读取一次结果
注意:
同时执行多条命令后,得到的结果很可能是一部分;(1024),因为在执行其他命令的时候又接收之前执行的另一部分结果,这种现象就是黏包
基于tcp协议实现黏包:
注意:只有tcp有黏包现象,udp永远不会黏包
使用struct解决黏包:
借助struct模块,长度数字可以被转换成一个标准大小的4字节数字,因此可以利用这个特点来预先发送数据长度。
发送时 | 接收时 |
先发送struct转换好的数据长度4字节 | 先接收4个字节使用struct转换成数字来获取要接收的数据长度 |
再次发送 | 再按照长度接收数据 |