• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

procotol.go源码阅读

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
import (
    "bytes"
    "encoding/binary"
)

const (
    // 支持数据最大长度为 2 << 61
    // DataLengthOfLenth = 8
    // 支持数据最大长度为 2 << 30
    DataLengthOfLenth = 4
)

//通讯协议处理,主要处理封包和解包的过程
type Protocol struct {
    // 包头
    header string
    // 包头长度
    headerLen int
}

func NewProtocol(packetHeader string) *Protocol {
    return &Protocol{
        header:    packetHeader,
        headerLen: len([]byte(packetHeader)),
    }
}

func (self *Protocol) ReSet(header string) {
    self.header = header
    self.headerLen = len([]byte(header))
}

//封包
func (self *Protocol) Packet(message []byte) []byte {
    return append(append([]byte(self.header), IntToBytes(len(message))...), message...)
}

//解包
func (self *Protocol) Unpack(buffer []byte) (readerSlice [][]byte, bufferOver []byte) {
    length := len(buffer)

    var i int
    for i = 0; i < length; i = i + 1 {
        if length < i+self.headerLen+DataLengthOfLenth {
            break
        }
        if string(buffer[i:i+self.headerLen]) == self.header {
            messageLength := BytesToInt(buffer[i+self.headerLen : i+self.headerLen+DataLengthOfLenth])
            if length < i+self.headerLen+DataLengthOfLenth+messageLength {
                break
            }
            data := buffer[i+self.headerLen+DataLengthOfLenth : i+self.headerLen+DataLengthOfLenth+messageLength]

            readerSlice = append(readerSlice, data)

            i += self.headerLen + DataLengthOfLenth + messageLength - 1
        }
    }

    if i == length {
        bufferOver = make([]byte, 0)
        return
    }
    bufferOver = buffer[i:]
    return
}

//整形转换成字节
// func IntToBytes(n int) []byte {
//     x := int64(n)

//     bytesBuffer := bytes.NewBuffer([]byte{})
//     binary.Write(bytesBuffer, binary.BigEndian, x)
//     return bytesBuffer.Bytes()
// }

// //字节转换成整形
// func BytesToInt(b []byte) int {
//     bytesBuffer := bytes.NewBuffer(b)

//     var x int64
//     binary.Read(bytesBuffer, binary.BigEndian, &x)

//     return int(x)
// }

//整形转换成字节
func IntToBytes(n int) []byte {
    x := int32(n)

    bytesBuffer := bytes.NewBuffer([]byte{})
    binary.Write(bytesBuffer, binary.LittleEndian, x)
    return bytesBuffer.Bytes()
}

//字节转换成整形
func BytesToInt(b []byte) int {
    bytesBuffer := bytes.NewBuffer(b)

    var x int32
    binary.Read(bytesBuffer, binary.LittleEndian, &x)

    return int(x)
}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go的defer-panic-and-recover发布时间:2022-07-10
下一篇:
macbook下 go 语言的 helloworld发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap