一:struct模块的使用

import struct
import json
header_dic={
 'filename':'a.txt',
    'total_size':11112313123212222222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111131222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223,
    'hash':'asdf123123x123213x'
} #定义报头,字典格式,报头里面可以存储各种需要的信息
header_json=json.dumps(header_dic)
#将报头序列化,得到一个json字符串
header_bytes=header_json.encode('utf-8')
#得到json的二进制格式

obj=struct.pack('i',len(header_bytes))#将整形数字打包成字节格式

#打包成二进制字典长度,发送给客户端

print(obj,len(obj))
# res=struct.unpack('i',header)#解包,是元祖形式,第一个是字节串长度

# print(res[0])

二:解决粘包问题

1, 服务端

from socket import *
import subprocess
import struct
import json
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
    conn,client_addr=server.accept()
    print('新的客户端',client_addr)
    while True:
        try:
            cmd=conn.recv(1024) #cmd=b'dir'
            if len(cmd) == 0:break
            # 运行系统命令
            obj=subprocess.Popen(cmd.decode('utf-8'),
                             shell=True,
                             stderr=subprocess.PIPE,
                             stdout=subprocess.PIPE
                             )
            stdout=obj.stdout.read()
            stderr=obj.stderr.read()
            #先制作报头
            header_dic={
                'filename':'a.txt',
                'total_size':len(stdout) + len(stderr),
                'hash':'xasf123213123'
            }
            header_json=json.dumps(header_dic)
            header_bytes=header_json.encode('utf-8')
            #1、先把报头的长度len(header_bytes)打包成4个bytes,然后发送
            conn.send(struct.pack('i',len(header_bytes)))
            #2、发送报头
            conn.send(header_bytes)
            #3、再发送真实的数据
            conn.send(stdout)
            conn.send(stderr)#用加号发送系哦啊率不高,最好发两次比较好
        except ConnectionResetError:
            break

conn.close()

2,客户端

from socket import *
import struct
import json
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
    cmd=input('>>: ').strip()
    if len(cmd) == 0:continue
    client.send(cmd.encode('utf-8'))
    #1、先收4个字节,该4个字节中包含报头的长度
    header_len=struct.unpack('i',client.recv(4))[0]
    #2、再接收报头
    header_bytes=client.recv(header_len)
    #从报头中解析出想要的内容
    header_json=header_bytes.decode('utf-8')
    header_dic=json.loads(header_json)
    print(header_dic)
    total_size=header_dic['total_size']
    #3、再收真实的数据
    recv_size=0
    res=b''
    while recv_size < total_size :
        data=client.recv(1024)
        res+=data
        recv_size+=len(data)

print(res.decode('gbk'))

粘包问题和struck解决相关推荐

  1. TCP粘包问题分析和解决(全)

    TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...

  2. TCP通信粘包问题分析和解决

    在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的 ...

  3. 网络:TCP粘包问题?如何解决?

    看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...

  4. Netty粘包拆包问题说明、演示拆包粘包情况代码以及解决

    概述 TCP传输协议是面向连接的,面向流提供高可靠的服务.收发两端(服务端和客户端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效地发给对方,使用了优化算法(Nagle算法 ...

  5. Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道

    无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...

  6. 并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。...

    并发编程知识总结 软件开发架构 C/S: client:客户端 server:服务端 优点:占用网络资源少,软件的使用稳定 缺点:服务端更新后,客户端也要更新,需要使用多个软件,需要下载多个客户端 B ...

  7. TCP粘包,拆包及解决方法、丢包的原因及解决办法

    参考此博客https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 粘包.拆包发生原因 发生TCP粘包或拆包有很多原因,现列出常见 ...

  8. 丢包、拆包、粘包的原因及解决办法

    参考此博客https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 粘包.拆包发生原因  发生TCP粘包或拆包有很多原因,现列出常 ...

  9. 关于为什么出现粘包问题及如何解决!

    1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾. 2 为什么出现粘包现象 (1)发送方原因 我们知道,TCP默认会使 ...

  10. TCP 中粘包的产生和解决

    当发送方的"发送速度"大于接收方的"处理速度"时,就会出现问题. 比如:接收方一直没有处理,发送方第一次发送一个包大小为 100 字节,第二次发送 200 字节 ...

最新文章

  1. php 词法分析,【PHP7源码学习】2019-03-20 PHP词法分析
  2. Andriod --- JetPack (四):BaseObservable 与 ObservableField 双向绑定
  3. SpringMVC(SSM)框架搭建JavaWeb项目时,前端页面文件上传,后台Java下载功能实现及相关问题记录说明
  4. 异常处理机制——panic 和 recover
  5. 结构数据类型 struce c# 1613533319
  6. 诺基亚n1系统更新显示无网络_曾经世界第一大手机系统,诺基亚塞班系统竟还活着!你用过吗?...
  7. 将SVG 转换为png -- ImageMagick 转换 svg 为透明png 图
  8. 富士施乐m115b怎么连接电脑_富士施乐m115b驱动下载
  9. 10247: 爱好数学的国王(唯一分解定理)
  10. 51单片机--蜂鸣器
  11. DFS.01-寻路问题
  12. Barcode Reader在45毫秒内实现条码识别
  13. 操作系统接口之批处理作业
  14. 方便实用的串口调试工具/串口调试助手/串口精灵 (工具一)
  15. 东芝存储器株式会社计划搬迁总部
  16. 细说http状态码之301,304
  17. python基础(第九章)面向对象
  18. 9.数据中台 --- 数据服务体系建设
  19. Discuz!教程之论坛编辑器默认勾选HTML代码的修改方法
  20. 三年级下册分数计算机题,三年级下册数学卷子题

热门文章

  1. Log Parser Lizard(日志分析工具)v6.7.1官方版
  2. tftp工作流程计算机网络,tftpd32使用方法,[转载]利用GhostSrv+Tftpd32网络克隆攻略
  3. ie上直接打开服务器word文档,win7 ie11直接打开word
  4. “Win10 无法使用内置管理员账户打开(应用程序)“怎么办
  5. 金仓数据库字段_金仓数据库认证工程师(KCE)考试试题_含答案_
  6. Linux常见英文报错中文翻译
  7. SpringMVC中session的使用
  8. 艾永亮:百果园的商业模式是什么?打造超级产品引领生鲜电商行业
  9. Python基础学习笔记-4.组合数据类型
  10. 读《把时间当作朋友:运用心智获得解放》