day27 学习小结

subprocess模块

  1. 可以帮你通过代码执行操作系统的终端命令

  2. 返回终端执行命令后的结果

通过popen类实例化出一个对象,再通过这个对象,默认的stdout,stderr参数,返回终端执行命令后得到的结果。

粘包问题

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

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

导致粘包问题的原因

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

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

  1. 不需要建立双向管道。
  2. 不会粘包。
  3. 客户端给服务器发送数据,不需要等待服务端返回接收成功。
  4. 数据容易丢失,不安全
  • TCP:就好比在打电话
  • UDP:就好比在发短信

SocketServer

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

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

猜你喜欢

转载自www.cnblogs.com/bowendown/p/11704203.html