python摸爬滚打之day28----黏包处理

1、缓冲区和subprocess模块

  1.1  缓冲区

    

  每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。

  write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。

  TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。

  read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。

  2.2  解释器调用系统指令----> subprocess

 1 import subprocess      # 解释器操作cmd的模块
 2 recv_msg = input("输入cmd命令: ")
 3 cmd_obj = subprocess.Popen(
 4     recv_msg,       # 输入的cmd指令,"dir", "ipconfig" ......
 5     shell=True,     # shell = True, 即相当于使用cmd窗口
 6     stdout=subprocess.PIPE,      # 标准输出信息都在PIPE管道中
 7     stderr=subprocess.PIPE,      # 出错信息也在PIPE管道中
 8 )
 9 cmd_msg = cmd_obj.stdout.read().decode("gbk")        # 对象调用里面的stdout属性, 并读取出来.(和计算机交互一般都以GBK编码解码)   
10 print(cmd_msg)
subprocess模块

2、黏包

  现象1: 连续send两个比较小点的数据时, TCP的Nagle算法和延迟ACK机制, 减少大量小包的连续发送, 所以会将比较小的连续发送的数据合并成一个比较大的包, 这是第一种黏包;

  现象2: send()给缓冲区扔了太多数据, 超过缓冲区的大小就会报错, 每个IP包一般最大为1500b, 如果超过这个值就会被拆包发送, 第一次剩下的数据有可能和第二次发送的数据一起连在一起被接收, 这就是第二种黏包;

3、

4、

5、

猜你喜欢

转载自www.cnblogs.com/bk9527/p/10010049.html