TcpCodec.go 729 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package base
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "github.com/panjf2000/gnet"
  6. log "github.com/sirupsen/logrus"
  7. )
  8. type TcpCodec struct {
  9. }
  10. func (pc *TcpCodec) Encode(c gnet.Conn, buf []byte) (out []byte, err error) {
  11. rs := make([]byte, 4)
  12. binary.LittleEndian.PutUint32(rs, uint32(len(buf)))
  13. out = bytes.Join([][]byte{rs, buf}, []byte(""))
  14. return
  15. }
  16. func (pc *TcpCodec) Decode(c gnet.Conn) (out []byte, err error) {
  17. log.Info("收到了消息", c.Read())
  18. // c.AsyncWrite(out)
  19. //读取前四个字节 size int, buf []byte
  20. rs, bs := c.ReadN(4)
  21. if rs != 4 {
  22. return
  23. }
  24. //
  25. ts := int(binary.LittleEndian.Uint32(bs)) + rs
  26. size, buf := c.ReadN(ts)
  27. if size != ts {
  28. return
  29. }
  30. c.ShiftN(size)
  31. out = buf[4:]
  32. return
  33. }