package main import ( "encoding/binary" "encoding/json" "fmt" "io" "git.wanbits.io/joe/nnet" ) type EchoPacket struct { Id int32 Msg string } func (self *EchoPacket) ShouldClose() (bool, int32) { if self.Msg == "quit" { return true, 8 } return false, 0 } type TcpProtocol struct { } func (self *TcpProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) { buf := make([]byte, 2048) n, err := io.ReadFull(conn, buf[:4]) if err != nil { fmt.Println("ERROR1:", err) return nil, err } if n != 4 { fmt.Println("ERROR2:", "n != 4") return nil, nnet.ErrReadBlocking } pkt := &EchoPacket{} dataLen := binary.LittleEndian.Uint32(buf[:4]) n, err = io.ReadFull(conn, buf[4:4+dataLen]) if n != int(dataLen) { fmt.Println("ERROR3:", "n != dataLen", n, "!=", dataLen) return nil, nnet.ErrReadBlocking } pkt.Id = int32(binary.LittleEndian.Uint32(buf[4:8])) pkt.Msg = string(buf[8:]) return pkt, nil } func (self *TcpProtocol) Serialize(packet nnet.IPacket) ([]byte, error) { p, yes := packet.(*EchoPacket) if !yes { fmt.Println("ERROR5:", "!yes") return nil, nnet.ErrReadBlocking // some error } buf := make([]byte, 2048) dataLen := 4 + len(p.Msg) binary.LittleEndian.PutUint32(buf, uint32(dataLen)) binary.LittleEndian.PutUint32(buf[4:], uint32(p.Id)) copy(buf[8:], []byte(p.Msg)) return buf[:8+len(p.Msg)], nil } type WsProtocol struct { } func (self *WsProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) { buf := make([]byte, 2048) n, err := conn.Read(buf) if err != nil { fmt.Println("ERROR1:", err) return nil, err } //TODO decrypt //TODO uncompress pkt := &EchoPacket{} err = json.Unmarshal(buf[:n], pkt) if err != nil { fmt.Println("ERROR2:", err) return nil, err } return pkt, nil } func (self *WsProtocol) Serialize(packet nnet.IPacket) ([]byte, error) { p, yes := packet.(*EchoPacket) if !yes { fmt.Println("ERROR3:", yes) return nil, nnet.ErrReadBlocking // some error } data, err := json.Marshal(p) if err != nil { fmt.Println("ERROR4:", err) return nil, err } //TODO compress //TODO encrypt return data, nil }