server.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package main
  2. import (
  3. "encoding/json"
  4. "git.wanbits.io/joe/franklin/comp"
  5. "git.wanbits.io/joe/franklin/protos"
  6. "git.wanbits.io/joe/kettle/log"
  7. "git.wanbits.io/joe/kettle/utl"
  8. "git.wanbits.io/joe/nnet"
  9. "github.com/golang/protobuf/proto"
  10. "go.uber.org/zap"
  11. )
  12. // C/S packet
  13. type CSPacket struct {
  14. *protos.Request
  15. }
  16. func (self *CSPacket) ShouldClose() (bool, int32) {
  17. return false, 0
  18. }
  19. type SCPacket struct {
  20. resp *protos.Response
  21. closing bool
  22. reason int32
  23. }
  24. func (self *SCPacket) ShouldClose() (bool, int32) {
  25. return self.closing, self.reason
  26. }
  27. // protocol && callback
  28. type CSProtocol struct{
  29. }
  30. func (self *CSProtocol) ReadPacket(conn nnet.IConn) (nnet.IPacket, error) {
  31. buf := comp.GBufPool.Get()
  32. defer comp.GBufPool.Put(buf)
  33. n, err := conn.Read(buf)
  34. if err != nil {
  35. return nil, err
  36. }
  37. var req *protos.Request
  38. err = proto.Unmarshal(buf[:n], req)
  39. if err != nil {
  40. return nil, err
  41. }
  42. p := &CSPacket{
  43. req,
  44. }
  45. return p, nil
  46. }
  47. func (self *CSProtocol) Serialize(packet nnet.IPacket) ([]byte, error) {
  48. p, ok := packet.(*SCPacket)
  49. if !ok {
  50. return nil, utl.ErrInterfaceTransform
  51. }
  52. return json.Marshal(p.resp)
  53. }
  54. func (self *CSProtocol) OnClosed(ses nnet.ISession, reason int32) {
  55. log.Debug("lost connection", zap.String("remote", ses.GetRawConn().RemoteAddr().String()),
  56. zap.Uint64("id", ses.Id()))
  57. }
  58. func (self *CSProtocol) OnConnected(ses nnet.ISession) (bool, int32) {
  59. log.Debug("new client", zap.String("remote", ses.GetRawConn().RemoteAddr().String()))
  60. return true, 0
  61. }
  62. func (self *CSProtocol) OnMessage(ses nnet.ISession, pkt nnet.IPacket) bool {
  63. p, ok := pkt.(*CSPacket)
  64. if !ok {
  65. return false
  66. }
  67. dispatch(ses, p)
  68. return true
  69. }
  70. // server-side dont handle heartbeat.
  71. func (self *CSProtocol) OnHeartbeat(ses nnet.ISession) bool {
  72. return true
  73. }