| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package main
- import (
- "encoding/binary"
- "encoding/json"
- "fmt"
- "io"
- "one.com/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
- }
|