首页 > 其他分享 >【八】解决粘包的基础处理方法

【八】解决粘包的基础处理方法

时间:2023-06-23 17:23:04浏览次数:27  
标签:utf socket 处理 data 粘包 msg 解决 recv conn

【八】解决粘包的基础处理方法

  • 问题的根源在于
    • 接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕
    • 如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据
  • 基础版本的解决方法
    • 服务端
#_*_coding:utf-8_*_
__author__ = 'ly'
import socket,subprocess
ip_port=('127.0.0.1',8080)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind(ip_port)
s.listen(5)

while True:
    conn,addr=s.accept()
    print('客户端',addr)
    while True:
        msg=conn.recv(1024)
        if not msg:break
        res=subprocess.Popen(msg.decode('utf-8'),shell=True,\
                            stdin=subprocess.PIPE,\
                         stderr=subprocess.PIPE,\
                         stdout=subprocess.PIPE)
        err=res.stderr.read()
        if err:
            ret=err
        else:
            ret=res.stdout.read()
        data_length=len(ret)
        conn.send(str(data_length).encode('utf-8'))
        data=conn.recv(1024).decode('utf-8')
        if data == 'recv_ready':
            conn.sendall(ret)
    conn.close()
  • 客户端
#_*_coding:utf-8_*_
__author__ = 'ly'
import socket,time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
res=s.connect_ex(('127.0.0.1',8080))

while True:
    msg=input('>>: ').strip()
    if len(msg) == 0:continue
    if msg == 'quit':break

    s.send(msg.encode('utf-8'))
    length=int(s.recv(1024).decode('utf-8'))
    s.send('recv_ready'.encode('utf-8'))
    send_size=0
    recv_size=0
    data=b''
    while recv_size < length:
        data+=s.recv(1024)
        recv_size+=len(data)


    print(data.decode('utf-8'))

为什么这种处理方法不好?

程序的运行速度远快于网络传输速度,所以在发送一段字节前,先用send去发送该字节流长度,这种方式会放大网络延迟带来的性能损耗

标签:utf,socket,处理,data,粘包,msg,解决,recv,conn
From: https://www.cnblogs.com/dream-ze/p/17499387.html

相关文章

  • 【七】什么是粘包
    【七】什么是粘包须知:只有TCP有粘包现象,UDP永远不会粘包,为何,且听我娓娓道来首先需要掌握一个socket收发消息的原理发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据也就是说,应用程序所看......
  • 【九】解决粘包的进阶方法
    【九】解决粘包的进阶方法为字节流加上自定义固定长度报头,报头中包含字节流长度,然后一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据struct模块该模块可以把一个类型,如数字,转成固定长度的bytesstruct.pack(‘i’,1111111111111)。。。。。。。。。......
  • 解放计算力:使用并行处理提升python for循环速度
    Python是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈。幸运的是,Python提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作。本文将介绍如何使用并行处理技术来优化for循环,从而提高Python程序的执行速度。我们将讨论并行处......
  • 关于搭建github+hexo博客一些问题的解决
    最近通过github和hexo搭建博客时,遇到一些问题,这里写一篇博客记录一下他们的解决方法,顺便推荐几篇关于搭建博客的教程https://zhuanlan.zhihu.com/p/60578464https://firstfan119.github.io/2019/12/06/hexo-build-up/个人环境 Hexod报错hexod远程部署报错,报错信息如下:......
  • 预处理命令
    预处理是进行文本操作                                     预定义符号printf("%s\n",__FILE__); //__FILE__进行编译的源文件 printf("%d\n",__LINE__); //__LINE__文件当前进行的行号 printf(......
  • rust 集合、错误处理、泛型、Trait、生命周期、包
    集合组织特性相同的数据;泛型可以定义任何抽象数据类型;生命周期限制所有权的作用域范围;错误处理使程序更健壮。集合一组特性相同的数据集合,除了基本数据类型的元组、数组。rust标准库提供了一些非常有用的数据结构。Vector存储列表通过类型Vec<T>定义。只能存储相同类型的值,......
  • Java的GUI图形界面如何解决中文乱码问题
    问题描述写好一个简单的容器之后,却显示出来这样的界面:一看就是中文乱码的问题,现在就是需要去查阅资料去寻找相应的解决方法!问题解决1、选择这里Edit这里!2、然后再点击选择ModifyOptions3、再选择在弹出来的窗口里面选择ADDVMOptions,之后弹出来一个窗口界面4、最......
  • 历史最全最新中文自然语言处理预训练模型汇总分享
        在自然语言处理领域中,预训练语言模型(PretrainedLanguageModels)已成为非常重要的基础技术,本仓库主要收集目前网上公开的一些高质量中文预训练模型,并将持续更新。包含自然语言理解系列模型,如BERT、RoBERTa、ALBERT、NEZHA、XLNET、MacBERT、ELECTRA、ZEN、ERNIE。自然语言......
  • Error:java: Compilation failed: internal java compiler error 的解决过程
    1.错误描述:IDEA导入一个新的项目,运行时包编译失败在这里插入图片描述2.错误原因这个错误的原因是因为JDK版本问题,有两个原因,一个是编译器版本不匹配,一个是当前项目JDK版本不支持3.解决步骤需要调整三个位置的jdk版本调整项目的jdk版本,File-->ProjectStructure-->P......
  • Error:java: Compilation failed: internal java compiler error 的解决过程
    感谢原作者:https://blog.csdn.net/weixin_42045639/article/details/1255381611.错误描述:IDEA导入一个新的项目,运行时包编译失败2.错误原因这个错误的原因是因为JDK版本问题,有两个原因,一个是编译器版本不匹配,一个是当前项目JDK版本不支持3.解决步骤需要调整三个......