[Go] 轻量服务器框架tcp的粘包问题 封包与拆包

[Go] 轻量服务器框架tcp的粘包问题 封包与拆包,第1张

概述tcp传输的数据是以流的形式传输的,因此就没有办法判断到哪里结束算是自己的一个消息,这样就会出现粘包问题,多个包粘在一起了 可以使用这样一个自定义的形式来解决,一个消息分为 headʻody hea

tcp传输的数据是以流的形式传输的,因此就没有办法判断到哪里结束算是自己的一个消息,这样就会出现粘包问题,多个包粘在一起了

可以使用这样一个自定义的形式来解决,一个消息分为 head+body  head包括数据的长度和数据编号 , 长度和编号都是uint32类型 也就是32位 占有4个字节 , 总共head占有8个字节

封装一个消息的结构体,作为一个数据实体,比如下面这个,编号 数据 数据长度  三个属性

package znettype Message struct {    ID     uint32    Data   []byte    MsgLen uint32}func NewMessage() *Message {    m := &Message{}    return m}func (m *Message) GetID() uint32 {    return m.ID}func (m *Message) GetData() [] {    return m.Data}func (m *Message) GetMsgLen() uint32 {    return m.MsgLen}func (m *Message) SetID(ID uint32) {    m.ID = }func (m *Message) SetData(data []) {    m.Data = data}func (m *Message) SetMsgLen(len uint32) {    m.MsgLen = len}

封装一个封包解包的结构体,包括封包和解包的方法,封包就是先写长度,再写编号,再写数据;解包只是获取下长度和编号,数据下次再取

package znetimport "zinx/zinterface"import bytesenCoding/binarytype DataPack struct {}func NewDataPack() *DataPack {    dp := &DataPack{}    return dp}func (dp *DataPack) Pack(m zinterface.IMessage) ([],error) {    dataBuff := bytes.NewBuffer([]{})    binary.Write(dataBuff,binary.littleEndian,m.GetMsgLen())    binary.Write(dataBuff,m.GetID())    binary.Write(dataBuff,m.GetData())    return dataBuff.Bytes(),nil}func (dp *DataPack) Unpack(d []) (zinterface.IMessage,error) {    m := NewMessage()    r := bytes.NewReader(d)    binary.Read(r,&m.MsgLen)    binary.Read(r,1)">m.ID)    return m,nil}

测试,先封包再解包

    body:=[]byte(nihao)    m:=znet.NewMessage()    m.SetID(888)    m.SetData(body)    m.SetMsgLen(uint32(len(body)))    log.Println(m)    dp:=znet.NewDataPack()    dataPack,_:=dp.Pack(m)    log.Println(dataPack)    m2,1)">dp.Unpack(dataPack)    log.Println(m2)

2019/12/17 15:42:30 &{888 [110 105 104 97 111] 5}
2019/12/17 15:42:30 [5 0 0 0 120 3 0 0 110 105 104 97 111]
2019/12/17 15:42:30 &{888 [] 5}

结果就是上面的样子,解出来就可以去用了

 

总结

以上是内存溢出为你收集整理的[Go] 轻量服务器框架tcp的粘包问题 封包与拆包全部内容,希望文章能够帮你解决[Go] 轻量服务器框架tcp的粘包问题 封包与拆包所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1257311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存