一、说明
基于上篇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
三、总结
欢迎大家一起讨论,更好解决粘包问题的方式 。