From 61f1fc31b63fffb8aa996e555caa9b8bf21d8f72 Mon Sep 17 00:00:00 2001 From: Tnze Date: Tue, 2 Jun 2020 11:59:06 +0800 Subject: [PATCH] change packet id from Byte to VarInt. #59 --- data/packetIDs.go | 4 ++-- net/conn.go | 33 +++++++++++++------------ net/packet/packet.go | 57 ++++++++++++++++++++------------------------ 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/data/packetIDs.go b/data/packetIDs.go index 2f349d0..687e892 100644 --- a/data/packetIDs.go +++ b/data/packetIDs.go @@ -2,7 +2,7 @@ package data // Clientbound packet IDs const ( - SpawnObject byte = iota //0x00 + SpawnObject int32 = iota //0x00 SpawnExperienceOrb SpawnGlobalEntity SpawnMob @@ -104,7 +104,7 @@ const ( // Serverbound packet IDs const ( - TeleportConfirm byte = iota //0x00 + TeleportConfirm int32 = iota //0x00 QueryBlockNBT SetDifficulty ChatMessageServerbound diff --git a/net/conn.go b/net/conn.go index a8cbb4e..c2927a7 100644 --- a/net/conn.go +++ b/net/conn.go @@ -27,16 +27,19 @@ func ListenMC(addr string) (*Listener, error) { func (l Listener) Accept() (Conn, error) { conn, err := l.Listener.Accept() return Conn{ - Socket: conn, - ByteReader: bufio.NewReader(conn), - Writer: conn, + Socket: conn, + Reader: bufio.NewReader(conn), + Writer: conn, }, err } //Conn is a minecraft Connection type Conn struct { Socket net.Conn - io.ByteReader + Reader interface { + io.ByteReader + io.Reader + } io.Writer threshold int @@ -46,9 +49,9 @@ type Conn struct { func DialMC(addr string) (*Conn, error) { conn, err := net.Dial("tcp", addr) return &Conn{ - Socket: conn, - ByteReader: bufio.NewReader(conn), - Writer: conn, + Socket: conn, + Reader: bufio.NewReader(conn), + Writer: conn, }, err } @@ -56,9 +59,9 @@ func DialMC(addr string) (*Conn, error) { func DialMCTimeout(addr string, timeout time.Duration) (*Conn, error) { conn, err := net.DialTimeout("tcp", addr, timeout) return &Conn{ - Socket: conn, - ByteReader: bufio.NewReader(conn), - Writer: conn, + Socket: conn, + Reader: bufio.NewReader(conn), + Writer: conn, }, err } @@ -66,9 +69,9 @@ func DialMCTimeout(addr string, timeout time.Duration) (*Conn, error) { // Helps you modify the connection process (eg. using DialContext). func WrapConn(conn net.Conn) *Conn { return &Conn{ - Socket: conn, - ByteReader: bufio.NewReader(conn), - Writer: conn, + Socket: conn, + Reader: bufio.NewReader(conn), + Writer: conn, } } @@ -77,7 +80,7 @@ func (c *Conn) Close() error { return c.Socket.Close() } // ReadPacket read a Packet from Conn. func (c *Conn) ReadPacket() (pk.Packet, error) { - p, err := pk.RecvPacket(c.ByteReader, c.threshold > 0) + p, err := pk.RecvPacket(c.Reader, c.threshold > 0) if err != nil { return pk.Packet{}, err } @@ -93,7 +96,7 @@ func (c *Conn) WritePacket(p pk.Packet) error { // SetCipher load the decode/encode stream to this Conn func (c *Conn) SetCipher(ecoStream, decoStream cipher.Stream) { //加密连接 - c.ByteReader = bufio.NewReader(cipher.StreamReader{ //Set receiver for AES + c.Reader = bufio.NewReader(cipher.StreamReader{ //Set receiver for AES S: decoStream, R: c.Socket, }) diff --git a/net/packet/packet.go b/net/packet/packet.go index c863ac8..38912e7 100644 --- a/net/packet/packet.go +++ b/net/packet/packet.go @@ -9,12 +9,12 @@ import ( // Packet define a net data package type Packet struct { - ID byte + ID int32 Data []byte } //Marshal generate Packet with the ID and Fields -func Marshal(ID byte, fields ...FieldEncoder) (pk Packet) { +func Marshal(ID int32, fields ...FieldEncoder) (pk Packet) { pk.ID = ID for _, v := range fields { @@ -38,9 +38,7 @@ func (p Packet) Scan(fields ...FieldDecoder) error { // Pack 打包一个数据包 func (p *Packet) Pack(threshold int) (pack []byte) { - data := []byte{p.ID} //data - data = append(data, p.Data...) //data - + data := append(VarInt(p.ID).Encode(), p.Data...) if threshold > 0 { //是否启用了压缩 if len(data) > threshold { //是否需要压缩 Len := len(data) @@ -64,30 +62,18 @@ func (p *Packet) Pack(threshold int) (pack []byte) { } // RecvPacket receive a packet from server -func RecvPacket(r io.ByteReader, useZlib bool) (*Packet, error) { - var len int - for i := 0; i < 5; i++ { //读数据前的长度标记 - b, err := r.ReadByte() - if err != nil { - return nil, fmt.Errorf("read len of packet fail: %v", err) - } - len |= int(b&0x7F) << uint(7*i) - if b&0x80 == 0 { - break - } +func RecvPacket(r DecodeReader, useZlib bool) (*Packet, error) { + var length VarInt + if err := length.Decode(r); err != nil { + return nil, err } - - if len < 1 { + if length < 1 { return nil, fmt.Errorf("packet length too short") } - data := make([]byte, len) //读包内容 - var err error - for i := 0; i < len; i++ { - data[i], err = r.ReadByte() - if err != nil { - return nil, fmt.Errorf("read content of packet fail: %v", err) - } + data := make([]byte, length) // read packet content + if _, err := io.ReadFull(r, data); err != nil { + return nil, fmt.Errorf("read content of packet fail: %v", err) } //解压数据 @@ -95,9 +81,14 @@ func RecvPacket(r io.ByteReader, useZlib bool) (*Packet, error) { return UnCompress(data) } + buf := bytes.NewBuffer(data) + var packetID VarInt + if err := packetID.Decode(buf); err != nil { + return nil, fmt.Errorf("read packet id fail: %v", err) + } return &Packet{ - ID: data[0], - Data: data[1:], + ID: int32(packetID), + Data: buf.Bytes(), }, nil } @@ -113,21 +104,25 @@ func UnCompress(data []byte) (*Packet, error) { uncompressData := make([]byte, sizeUncompressed) if sizeUncompressed != 0 { // != 0 means compressed, let's decompress r, err := zlib.NewReader(reader) - if err != nil { return nil, fmt.Errorf("decompress fail: %v", err) } + defer r.Close() _, err = io.ReadFull(r, uncompressData) if err != nil { return nil, fmt.Errorf("decompress fail: %v", err) } - r.Close() } else { uncompressData = data[1:] } + buf := bytes.NewBuffer(uncompressData) + var packetID VarInt + if err := packetID.Decode(buf); err != nil { + return nil, fmt.Errorf("read packet id fail: %v", err) + } return &Packet{ - ID: uncompressData[0], - Data: uncompressData[1:], + ID: int32(packetID), + Data: buf.Bytes(), }, nil }