服务端代码如下

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. 【牛客网-剑指offer】矩形覆盖

    题目: 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析: 假设2为高,n为宽 因为高为2固定,会出现固定情况,即无论 ...

  2. 4python 解析库的使用

    4.1 xml库 https://cuiqingcai.com/5545.html XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是 ...

  3. h5py库

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

  4. 使用canvas时, 如何用相对单位(rem, rpx)来适配不同机型

    使用canvas的api时, 使用的都是绝对数值, 如: 方法传参是坐标位置,不带单位,如ctx.translate(10,10); 那么此时, 我就需要将rem或rpx 转换成 px; 首先, 获取 ...

  5. zabbix自带database monitor

    1. 在zabbix服务器上安装一下两个包: # yum -y install unixODBC mysql-connector-odbc 2. 修改zabbix服务器上ODBC配置: 2.1 Vim ...

  6. mongoose 与 mylab 的使用 (1)

    1.引入mongoose  模块 const mongoose = require('mongoose'); 2.连接数据库 //连接数据库 mongoose.connect( db, {useNew ...

  7. React 滚动事件

    代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UT ...

  8. [REPRINT] Java 101: Classes and objects in Java

    http://www.javaworld.com/article/2979739/learn-java/java-101-classes-and-objects-in-java.html?page=3 ...

  9. Spark核心原理初探

    一.运行架构概览 Spark架构是主从模型,分为两层,一层管理集群资源,另一层管理具体的作业,两层是解耦的.第一层可以使用yarn等实现. Master是管理者进程,Worker是被管理者进程,每个W ...

  10. c++11引入特性

    * 支持类内初始化. class A{ vector<string> strs{"abc", "def"}; };