|
|
@@ -0,0 +1,100 @@
|
|
|
+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
|
|
|
+}
|