package nnet import ( "encoding/hex" "fmt" ) // Type 数据帧类型,如:握手,心跳,数据 等 type Type byte const ( // Unknown 未知包类型,无意义 Unknown Type = iota // Handshake 握手数据(服务端主动发起) Handshake = 0x01 // HandshakeAck 握手回复(客户端回复) HandshakeAck = 0x02 // Heartbeat 心跳(服务端发起) Heartbeat = 0x03 // Data 数据传输 Data = 0x04 // Kick 服务端主动断开连接 Kick = 0x05 ) type MsgType byte // Message types const ( Request MsgType = 0x00 Notify = 0x01 Response = 0x02 Push = 0x03 ) var msgTypes = map[MsgType]string{ Request: "Request", Notify: "Notify", Response: "Response", Push: "Push", } func (t MsgType) String() string { return msgTypes[t] } type ( Header struct { PacketType Type // 数据帧 类型 Length uint32 // 数据长度 MessageHeader // 消息头 } MessageHeader struct { MsgType MsgType // message type (flag) ID uint64 // unique id, zero while notify mode Route string // route for locating service compressed bool // if message compressed } Packet struct { Header Data []byte // 原始数据 } ) func newPacket(typ Type) *Packet { return &Packet{ Header: Header{ PacketType: typ, MessageHeader: MessageHeader{}, }, } } func (p *Packet) GetHeader() any { return p.Header } func (p *Packet) GetLen() uint64 { return uint64(p.Length) } func (p *Packet) GetBody() []byte { return p.Data } func (p *Packet) String() string { return fmt.Sprintf("Packet[Type: %d, Len: %d] Message[Type: %s, ID: %d, Route: %s, Compressed: %v] BodyStr: [%s], BodyHex: [%s]", p.PacketType, p.Length, p.MsgType, p.ID, p.Route, p.compressed, string(p.Data), hex.EncodeToString(p.Data)) }