MQTT数据粘包问题

MQTT数据粘包问题当向服务器传输数据时候

会有一个比较大的数据缓冲区,来存放接收的数据,为了保证能够完整的接收到数据,因此缓冲区都会设置的比较大。在收发数据频繁时,由于tcp传输消息的无边界,会导致客户端/服务器端不知道接收到的消息到底是第几条消息,因此,会导致类似一次性接收几条消息的情况,从而乱码。

    方法一:数据粘包问题的出现是因为缓冲区过大,因此采用发送/接收变长消息的方法,在发送/接收消息时,将消息的长度作为消息的一部分发送出去,从而接收方可以根据传来的长度信息,制定相应长度作为包的起始部分的接收缓冲区根据读取data[0:2]动态伸缩;

    方法二:将发送的每条消息的首尾都加上特殊标记符,前加"<"   后加">"。这里我采取的是先将要发送的所有消息,首尾加上特殊标记后,都先放在一个字符串string中,然后一次性的发送给接收方,接受之后,再根据标记符< >,将一条条消息择(zhái)出来。

方法三:

在两次send中间放一个time.time(0.5)可以解决这个问题,这个比较low,对数据实时性要求不高的场合适用。

func PushMsgArr(tosendArr map[string]string){
   for _,v :=range tosendArr{
      time.Sleep(time.Second*1)
      PublishMsg(v)
   }
}

程序中使用的没有问题,简单实时性要求不高的场合

你可能感兴趣的:(go,物联网)