echo_protocol.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package main
  2. import (
  3. "encoding/binary"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "git.wenlab.co/joe/nnet"
  8. )
  9. type EchoPacket struct {
  10. Id int32
  11. Msg string
  12. }
  13. func (self *EchoPacket) ShouldClose() (bool, int32) {
  14. if self.Msg == "quit" {
  15. return true, 8
  16. }
  17. return false, 0
  18. }
  19. type TcpProtocol struct {
  20. }
  21. func (self *TcpProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) {
  22. buf := make([]byte, 2048)
  23. n, err := io.ReadFull(conn, buf[:4])
  24. if err != nil {
  25. fmt.Println("ERROR1:", err)
  26. return nil, err
  27. }
  28. if n != 4 {
  29. fmt.Println("ERROR2:", "n != 4")
  30. return nil, nnet.ErrReadBlocking
  31. }
  32. pkt := &EchoPacket{}
  33. dataLen := binary.LittleEndian.Uint32(buf[:4])
  34. n, err = io.ReadFull(conn, buf[4:4+dataLen])
  35. if n != int(dataLen) {
  36. fmt.Println("ERROR3:", "n != dataLen", n, "!=", dataLen)
  37. return nil, nnet.ErrReadBlocking
  38. }
  39. pkt.Id = int32(binary.LittleEndian.Uint32(buf[4:8]))
  40. pkt.Msg = string(buf[8:])
  41. return pkt, nil
  42. }
  43. func (self *TcpProtocol) Serialize(packet nnet.IPacket) ([]byte, error) {
  44. p, yes := packet.(*EchoPacket)
  45. if !yes {
  46. fmt.Println("ERROR5:", "!yes")
  47. return nil, nnet.ErrReadBlocking // some error
  48. }
  49. buf := make([]byte, 2048)
  50. dataLen := 4 + len(p.Msg)
  51. binary.LittleEndian.PutUint32(buf, uint32(dataLen))
  52. binary.LittleEndian.PutUint32(buf[4:], uint32(p.Id))
  53. copy(buf[8:], []byte(p.Msg))
  54. return buf[:8+len(p.Msg)], nil
  55. }
  56. type WsProtocol struct {
  57. }
  58. func (self *WsProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) {
  59. buf := make([]byte, 2048)
  60. n, err := conn.Read(buf)
  61. if err != nil {
  62. fmt.Println("ERROR1:", err)
  63. return nil, err
  64. }
  65. //TODO decrypt
  66. //TODO uncompress
  67. pkt := &EchoPacket{}
  68. err = json.Unmarshal(buf[:n], pkt)
  69. if err != nil {
  70. fmt.Println("ERROR2:", err)
  71. return nil, err
  72. }
  73. return pkt, nil
  74. }
  75. func (self *WsProtocol) Serialize(packet nnet.IPacket) ([]byte, error) {
  76. p, yes := packet.(*EchoPacket)
  77. if !yes {
  78. fmt.Println("ERROR3:", yes)
  79. return nil, nnet.ErrReadBlocking // some error
  80. }
  81. data, err := json.Marshal(p)
  82. if err != nil {
  83. fmt.Println("ERROR4:", err)
  84. return nil, err
  85. }
  86. //TODO compress
  87. //TODO encrypt
  88. return data, nil
  89. }