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
三、总结

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

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