服务端代码如下

import struct
import subprocess
import socket
server = socket.socket()
server.bind(('127.0.0.1',))
server.listen()
coon,addr = server.accept()
cmd = coon.recv().decode('utf8')
obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
obj1 = obj.stdout.read()
obj2 = obj.stderr.read()
len_obj = len(obj1+obj2)
len_obj = struct.pack('i',len_obj)
coon.send(len_obj)
coon.send(obj1+obj2)
coon.close()
server.close()

客户端代码

import struct
import socket
client = socket.socket()
client.connect(('127.0.0.1',8900))
cmd = input('>>>')
client.send(cmd.encode('utf8'))
form_server_len = client.recv(4)
print(form_server_len)
form_server_len = struct.unpack('i',form_server_len)[0]
print(form_server_len)
read_len = b''
while len(read_len) < form_server_len:
data = client.recv(1024)
read_len += data
print(read_len.decode('gbk'))
client.close()

  

每次发送总数据时,要提前将总数据的字节数发过去.
 b1 = b'fjdklsfjdsklfjdslfdljskfa'  总长度为:6000个字节 len(b1) = 6000int的字节数
 b2 = b'fdisfkljdsjafkl'  总长度为:400个字节 len(b2) = 400 int的字节数
 int类型不能直接发送  你要将不同长度的数字类型转化成bytes
 6000 ----> str(6000) ----> bytes(6000) b'6000'
 此数据的构成:     | 数据的总字节数(b'6000')|    具体数据
 send(b'6000')
 send(b'fjdklsfjdsklfjdslfdljskfa')
 由于粘包现象,两次send可能会结合成一个数据发送:
  b'6000fjdklsfjdsklfjdslfdljskfa
  len(b'6000')  4个字节
 recv(4)  ---> b'6000'
 剩下的6000个字节的数据我要循环recv() b'fjdklsfjdsklfjdslfdljskfa'
 你面临的问题: 要将不固定长度的int 转化成固定长度的bytes 利用struct模块
 # ret = struct.pack('i',6000)
 # print(ret,type(ret),len(ret))  # 固定长度的bytes 4个字节  'b\xe5\x2c\xe1\xe7\'
  
  此数据的构成:     | 数据的总字节数(b'6000') (固定长度 4个字节)|    具体数据
 send(ret)
 send(b'fjdklsfjdsklfjdslfdljskfa')
 由于粘包现象,两次send可能会结合成一个数据发送:
  b'6000fjdklsfjdsklfjdslfdljskfa
  len(b'6000')  4个字节
 recv(4)  ---> ret 根据struct反解出ret
 # w = struct.unpack('i',ret)[0]
 # w = 6000 int类型
 total_data = b''
 while len(total_data) < w:
  data = conn.recv(1024)
  total_data += data

struct解决socket黏包问题 (指令传输)的更多相关文章

  1. C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)

    介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...

  2. 解决Socket粘包问题——C#代码

    解决Socket粘包问题——C#代码 前天晚上,曾经的一个同事问我socket发送消息如果太频繁接收方就会有消息重叠,因为当时在外面,没有多加思考 第一反应还以为是多线程导致的数据不同步导致的,让他加 ...

  3. struct 模块解决 TCP黏包问题

    首先来看一下产生黏包现象的一段代码: # server.py 服务端 import socket ​ sk = socket.socket() sk.bind(('127.0.0.1',9000)) ...

  4. 解决socket粘包的两种low版模式 os.popen()和struct模块

    os.popen()模式 server端 import socket import os phone = socket.socket() # 实例化一个socket对象 phone.bind((&qu ...

  5. day 24 socket 黏包

    socket 套接字的使用: tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 server 端 import socket sk = socket.socket() # 实例化一个 ...

  6. python学习之socket&黏包

    7.4 socket ​ [重要] 避免学习各层的接口,以及协议的使用, socket已经封装好了所有的接口,直接使用这些接口或者方法即可,方便快捷,提升开发效率. socket在python中就是一 ...

  7. 通过大量实战案例分解Netty中是如何解决拆包黏包问题的?

    TCP传输协议是基于数据流传输的,而基于流化的数据是没有界限的,当客户端向服务端发送数据时,可能会把一个完整的数据报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大报文进行发送. 在这样的情况 ...

  8. 网络编程基础【day09】:解决socket粘包之大数据(七)

    本节内容 概述 linux下运行效果 sleep解决粘包 服务端插入交互解决粘包问题 一.概述 刚刚我们在window的操作系统上,很完美的解决了,大数据量的数据传输出现的问题,但是在Linux环境下 ...

  9. Python之黏包的解决

    黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候,发送的长度和接收的长度不匹配的情况下就 ...

随机推荐

  1. sql查询静态数据

    select * from ( ,,,'高中')) AS Education ( EducationId,EducationName )

  2. 虚拟机设置静态IP地址

    前言 NAT连接方式只能配置一次,配置好子网掩码和网关IP后,虚拟机NAT连接的ip段都是同一个ip段 1.菜单栏选择 编辑 -> 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 N ...

  3. h5py库

    参考文献:http://docs.h5py.org/en/latest/high/dataset.html h5py文件存放数据集(dataset)和组(group). dataset类似数组类的数据 ...

  4. 2PC和3PC

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484077.html 2PC 是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点 ...

  5. Vue开发环境的搭建及基本开发流程

    1.下载并安装node,下载地址. 2.命令行运行以下命令安装npm淘宝镜像; npm install -g cnpm --registry=https://registry.npm.taobao.o ...

  6. C# ArrayList、HashSet、HashTable、List、Dictionary的区别

    在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求. 由于这种限制不方便,所以出现了ArrayList. ArrayList.List<T> ArrayList是可变长数组,你 ...

  7. SCP-bzoj-1019

    项目编号:bzoj-1019 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 对于一个hanoi,知道了各种移动操作的优先级,也就确定了方案.可以证明对于盘子数为N的hanoi,任意移动方案都 ...

  8. Alpha冲刺阶段博客目录

    Alpha冲刺阶段博客目录 Scrum Meeting 时间 链接 内容 第六周 https://www.cnblogs.com/error0/p/11815255.html 需求分析 第七周 htt ...

  9. 使用ui给定的字体,通过css引入字体库

    @font-face { font-family: 'LCDMonoNormal'; src: url('../../assets/fonts/LCDM2N__.eot'); src: url('.. ...

  10. redis安装-1

    redis安装 cd /opt/tools/ #包目录 tar -xf redis-.tar.gz cd redis- make#centos7安装   make MALLOC=libc && ...