一, 缓冲区:  将程序和网络解耦

  输入缓冲区

  输出缓冲区

二,  sunbprocess模块

import subprocess
sub_obj = subprocess.Popen('ipconfig',  #系统指令shell=True,  #固定stdout=subprocess.PIPE, #标准输出  PIPE 管道,保存着指令的执行结果stderr=subprocess.PIPE )#标准错误输出a = sub_obj.stdout.read()  #执行"ipconfig"命令的结果,且a为字节类型
b = sub_obj.stderr.read()  #错误输出,但"ipconfig"命令可执行,所以b为空print('正确输出',a.decode('gbk'))  #因为操作系统的编码为"gbk",所以a字节应该用"gbk"来解码
print('错误输出',b.decode('gbk'))  #如果命令不可以被执行,b.decode('gbk')会打印 不是内部或外部命令...

  

三, 两种黏包现象:

  1 连续的小包可能会被优化算法给组合到一起进行发送

  2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱(看代码)

  黏包的服务端

import socket
import subprocess
server = socket.socket()
ip_port = ("127.0.0.1",8001)
server.bind(ip_port)
server.listen()
conn,add = server.accept()
while 1 :from_client = conn.recv(1024).decode("utf-8")print(from_client)sub_obj = subprocess.Popen(from_client,shell = True,stdout = subprocess.PIPE,stderr = subprocess.PIPE)std_msg = sub_obj.stdout.read()print("执行指令的长度:",len(std_msg))conn.send(std_msg)

  

  黏包的客户端

import socketclient = socket.socket()
client.connect(('127.0.0.1',8001))while 1:cmd = input('请输入指令:')client.send(cmd.encode('utf-8'))server_cmd_result = client.recv(1024)print(server_cmd_result.decode('gbk'))

  当客户端输入"ipconfig/all"之后,服务端发送给客户端的内容最多为1024字节,不能完全发过来.当客户端再输入一个"dir"命令后,之前没发完的消息会继续传给客户端,这就是黏包

   解决黏包现象有两种方案

  方案一:由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的信息内容,所以在发送真实数据之前,要先发送数据的长度,接收端根据长度来接收后面的真实数据,但是双方有一个交互确认的过程

  方案二: (重点)

    Struct模块,

      打包:struct.pack(‘i’,长度)

      解包:struct.unpack(‘i’,字节) ,解包出来是元组,需要拿到元组的第0项索引的数据,就是之前的长度

  解决黏包现象的服务端

import socket
import subprocess
import struct
server = socket.socket()
ip_port = ("127.0.0.1",8003)
server.bind(ip_port)
server.listen()
conn,add = server.accept()
while 1 :# 收到客户端发来的消息,并进行解码from_client = conn.recv(1024).decode("utf-8")print(from_client)# 把收到的消息,放在"subprocess"模块中执行"Popen"方法(执行这条消息的指令)sub_obj = subprocess.Popen(from_client,shell = True,stdout = subprocess.PIPE,stderr = subprocess.PIPE)# 得到执行命令的结果,该结果为字节std_msg = sub_obj.stdout.read()#打印这个结果(字节)的长度print("执行指令的长度:",len(std_msg))# 把这个长度在"struct"模块中执行"pack"方法,"i"参数是把数字编译成4位字节(打包)dabao = struct.pack("i",len(std_msg))# 把执行指令的结果,前面加上这个结果的长度(4位字节),(把打包"dabao"嵌在真实结果的包头)发送到客户端conn.send(dabao+std_msg)

  

  解决黏包现象的客户端

import socket
import struct
client = socket.socket()
client.connect(('127.0.0.1',8003))
while 1:cmd = input('请输入指令:')# 把输入的指令进行编码,传到服务端端client.send(cmd.encode('utf-8'))# 收到服务端发过来的消息(4个字节),其实就是服务端打包的执行命令的真实内容的长度.server_len_a = client.recv(4)# 在"struct"模块中执行"unpack"方法,把收到的4个字节解包# 取出该解包之后的元组中的索引为0的元素,该元素就是执行命令的(字节的)长度#  重点:解包出来的是元组,且只有一个元素server_len = struct.unpack('i',server_len_a)[0]# 再次收到服务端发过来的消息,"recv"后面的参数为执行命令的(字节的)长度server_msg = client.recv(server_len)# 因为操作系统编码为"gbk",所以执行命令的(字节类型)解码为"gbk"print(server_msg.decode('gbk'))

  

转载于:https://www.cnblogs.com/gyc-tzx/p/10222539.html

黏包现象和解决黏包的方法相关推荐

  1. 粘包现象与解决粘包问题

    粘包现象与解决粘包问题 一.引入 粘包问题主要出现在用TCP协议传输中才会出现的问题,UDP不会出现,因为TCP传输中他会服务端会一次性把所有东西一并丢入缓存区,而读取的内容大小有时候没法准确的做到一 ...

  2. socket Php 粘包,python3 tcp的粘包现象和解决办法解析

    这篇文章主要介绍了python3 tcp的粘包现象和解决办法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 服务器端 import socket ...

  3. 战地指挥官 服务器维护,战地指挥官突然显示数据包损坏怎么办 解决数据包损坏方案...

    战地指挥官突然显示数据包损坏怎么办 解决数据包损坏方案.战地指挥官是一款非常好玩的游戏,许多玩家被其优秀的内容和有趣的玩法所吸引.但是近日有小伙伴反应战地指挥官突然显示数据包损坏,小编这里整理了一些战 ...

  4. 黏包现象及其解决方法

    1.黏包现象 服务端: 客户端: 第一次 dir 数据 < 1024 接收所有数据 第二次 ipconfig 数据 > 1024 接收1024个字节 第三次 dir 数据 < 102 ...

  5. 粘包现象以及如何处理粘包

    转载自http://www.cnblogs.com/zhangsanfeng/p/8891149.html 一  粘包现象 首先我们要知道什么是粘包: 我们首先要知道,粘包是对于TCP来说的,UDP是 ...

  6. 黏包现象和HTTP协议

    黏包现象和HTTP协议 黏包现象 什么是黏包 解决方案 HTTP协议 HTTP协议概念 URL的概念 查看HTTP通信过程 HTTP请求报文分析 HTTP响应报文分析 静态web服务器 什么是静态we ...

  7. python中黏包问题的解决

    python中黏包问题的解决 1.在前面我们知道tcp容易产生黏包的问题,而udp不会产生黏包的问题,但是会产生丢包的问题,tcp应用的场景很多所以黏包问题必须要解决. 1.解决黏包问题第一种方法,我 ...

  8. 学习笔记(12):Python网络编程并发编程-解决粘包问题-简单版本

    立即学习:https://edu.csdn.net/course/play/24458/296243?utm_source=blogtoedu 粘包现象的解决:简单版 1.思路:       在服务器 ...

  9. TCP利用封包和解包解决“粘包”问题

    本文参考自徐晓鑫<后台开发>,给出一个可实际应用的demo,该demo核心在于封包和解包的思想,以及自定义发送.接收数据. 一.TCP粘包现象 what? TCP是个"流&quo ...

最新文章

  1. 如何使用Python创建,读取,更新和搜索Excel文件
  2. 归于软银帐下,ARM需要接受的变与不变
  3. Pacbio HiFi技术原理与应用软件实例
  4. 2022 年营销自动化七大趋势前瞻
  5. SAP Cloud for Customer里图片数据读取的逻辑
  6. AI+遥感智能解译,赋能智慧城市规划革新(人工智能案例)
  7. python 对象引用、可变性 和 垃圾回收
  8. python爬虫程序框架的理论是什么_Python网络爬虫(scrapy框架简介和基础应用)
  9. 怎么禁用域控下的计算机配置,怎样从Windows域环境下禁用USB口设备
  10. viso怎么控制连接线_什么是节气门?多久清洗一次?怎么清洗?
  11. HCIE-Security Day11:双机热备,从VRRP到VGMP
  12. Ubuntu 下启用trackPoint
  13. MAXIMO学习笔记
  14. iOS必备小技巧(非常的全)
  15. 基于NFC的毕业纪念卡片
  16. 《数据结构与算法基础 严蔚敏版》第三章 堆栈与队列
  17. 力扣772 基本计算器III
  18. 记忆网络之End-To-End Memory Networks
  19. 数据库连接的Persist Security Info参数说明
  20. 控制Canon相机进行拍照,并把拍摄的照片存储到D盘

热门文章

  1. 京东向上的力量:初心不改,传递信赖
  2. ISFP型人格的性格缺陷和心理问题分析
  3. 探索神经网络的奥秘:如何优化模型和提高训练速度
  4. 编程软件中多行代码整体向左向右缩进快捷键
  5. 支付宝首页搜索栏淡出效果HTML,仿支付宝首页效果实现
  6. 阿里云代理商(聚搜云):这是云计算最好的时代
  7. 铁腕军阀服务器无响应,铁腕军阀冬季攻势
  8. c语言奖牌,一言不合晒奖牌,哪个是你心中的C位?
  9. 广联达bim5d手机端_广联达BIM5D手机端操作说明-周跟踪
  10. 在Adobe Illustrator中创建漂亮的冬季场景