服务端代码如下

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. #2560异或和问题 jdfz集训—秦岳

    题目描述 N个数字,要求选择M次,每次从N个数中选出两个数(Ai,Aj)(但不能和之前某次选择相同),此次选择的得分为Ai xor Aj. 求最大得分. 输入格式 第一行包含两个整数N,M 接下来一行 ...

  2. 内嵌iframe撑高父容器,底部有4px留白问题解决办法

    由于iframe是特殊标签, 1,iframe默认是块元素,其display样式默认值是block2,frame应该说即不是块元素也不是行内元素,它虽然有display样式,但其默认值是none3,f ...

  3. hadoop HA集群的安装

    1.hadoop集群规化 ip 主机名 安装软件 角色 运行进程 10.124.147.22 hadoop1 jdk.zookeeper.hadoop namenode/zookeeper/jobhi ...

  4. python 在图像上写中文字体 (python write Chinese in image)

    本人处理图像的时候经常使用opencv的包,但是 cv2.putText 显示不了中文,所以查找了如何在python在图像上写中文的方法,在伟大的Stack Overflow上面找到一个方法,分享给大 ...

  5. Mac上无法使用蓝牙时的7个修复程序

    蓝牙是一个很普遍的技术,除非它出现问题,你才会发现它.例如,你听歌很顺利时,直到AirPods突然断连.大多数时候,这是一个相对容易的修复,但有时可能会有些棘手. https://www.macdow ...

  6. SparkStreaming获取kafka数据的两种方式:Receiver与Direct

    简介: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以简单理解成: Receiver方式是通过zookeeper来连接kafka队列, Dire ...

  7. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  8. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)

    传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...

  9. 使用html5进行视频播放

    一直以来网页大多是使用 flash 来播放视频.在目前唱衰 flash 的环境下,HTML5 为我们带来了一个网页内视频播放的解决方案—— <video>标签. 在HTML5 中,可以通过 ...

  10. TopCoder - 15135 LongPalindromes

    https://vjudge.net/problem/TopCoder-15135 之前做过:本质不同的回文子序列个数 本题:位置不同即为不同. 如果还是设$f[l][r]$表示$l$,$r$结尾,就 ...