欢迎进入某某企业官方网站!
15年专注工业门定制服务
门业优质供应商
免费设计、物流配送
全国咨询热线 :

搜索关键字:
当前位置:官网首页 > 新闻资讯 > 公司新闻 >
[Go] 轻量服务器框架tcp的粘包问题 封包与拆包
作者: 发布日期:2019-12-20 21:22

tcp传输的数据是以流的方式传输的,因而就没有办法判别到哪里完毕算是自己的一个音讯,这样就会呈现粘包问题,多个包粘在一起了

能够运用这样一个自定义的方式来处理,一个音讯分为 head+body  head包含数据的长度和数据编号 , 长度和编号都是uint32类型 也便是32位 占有4个字节 , 一共head占有8个字节

封装一个音讯的结构体,作为一个数据实体,比方下面这个,编号 数据 数据长度  三个特点

package znet
type message struct {
 id uint32
 data []byte
 msglen uint32
func newmessage *message {
 m := message{}
 return m
func  getid uint32 {
 return m.id
func  getdata []byte {
 return m.data
func  getmsglen uint32 {
 return m.msglen
func  setid {
 m.id = id
func  setdata {
 m.data = data
func  setmsglen {
 m.msglen = len
}

封装一个封包解包的结构体,包含封包和解包的办法,封包便是先写长度,再写编号,再写数据;解包仅仅获取下长度和编号,数据下次再取

package znet
import "zinx/zinterface"
import "bytes"
import "encoding/binary"
type datapack struct {
func newdatapack *datapack {
 dp := datapack{}
 return dp
func  pack  {
 databuff := bytes.newbuffer
 binary.write)
 binary.write)
 binary.write)
 return databuff.bytes, nil
func  unpack  {
 m := newmessage
 r := bytes.newreader
 binary.read
 binary.read
 return m, nil
}

测验,先封包再解包

 body:=[]byte
 m:=znet.newmessage
 m.setid
 m.setdata
 m.setmsglen))
 log.println
 dp:=znet.newdatapack
 datapack,_:=dp.pack
 log.println
 m2,_:=dp.unpack
 log.println

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}



成果便是上面的姿态,解出来就能够去用了

 

相关产品

地址:广东省广州市天河区88号  全国服务热线:  邮箱:admin@baidu.com

备案号: