Python基于局域网自动建立通讯服务之解决Socket 频繁发送数据时数据粘包的问题(三)

一、说明

基于上篇socket 通讯问题 ,今天给大家分享一个解决 用 socket 建立 长连接时 ,数据粘包的问题,大多时候,我们在写项目过程中,都是用别人封装的第三方包 ,很少遇到数据粘包的问题,但是当你自己 去写基于 TCP/IP 协议去封装一个 套接字 ,自定义 buffer 缓冲区的时候,就会遇到 这样的问题,可能有小伙伴会问 什么数据粘包的问题,数据粘包就是,当你 在一条已经建立联通的长连接链路上,在间隔小于 100ms 的频率发送数据时,接收端 收到的数据不是 一条一条隔离开的数据,而是你同时收到多条连在一起的字符串,这主要是TCP协议会根据一定的策略,会把要发送的数据先放到缓冲区中,当达到一定程度时,在发送数据给接收端。如果没有一套格式来定义这些数据,我们就不能正确的解析数据

二、 解决方案

为了区分每一条数据,首先,我们要保证每条数据的独立性。
首先规定我们要传输的数据是JSON 格式的,然后,为了保证我们解析数据时不受 }{ 边界的影响,我们把每条要传输的数据放到 [] 中,格式:[JSON数据],
这样有再多的数据粘包问题我们也不怕了,收到数据后,我们开始解析数据:

 """
分析socket收到的数据,并进行粘包处理
msg:接收到的消息
"""
def parseTheReceivedMessage(msg):
    # print('解码后的数据 =====================',msg)
    textArr = msg.split('][')
    newTxtArr = []
    for item in textArr:
        str = item.replace('[','').replace(']','')
        newTxtArr.append(str)
    print('newTxtArr ==',newTxtArr)

    #过滤数据不全的字符串
    validStringArr = []
    for item in newTxtArr:
        leftCount = collections.Counter(item)['{']
        rightCount = collections.Counter(item)['}']
        if leftCount == rightCount:
            validStringArr.append(item)

    # print('解码后的数组 =====================',validStringArr)
    return validStringArr
三、总结

欢迎大家一起讨论,更好解决粘包问题的方式 。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 10,752评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,426评论 1 3
  • 没事就多看看书,因为腹有诗书气自华,读书万卷始通神。没事就多出去旅游,别因为没钱而找借口,因为只要你省吃俭用,来...
    向阳之心阅读 4,945评论 3 11
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 128,908评论 2 7

友情链接更多精彩内容