hook_event.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package model
  2. import (
  3. "net"
  4. "rocommon"
  5. "rocommon/rpc"
  6. "rocommon/util"
  7. "roserver/baseserver/model"
  8. "roserver/serverproto"
  9. )
  10. ///////////////////////////////////////////BroadcasterTCPEventHook
  11. //gate.backend
  12. type BroadcasterTCPEventHook struct {
  13. }
  14. //来自后台服务器的消息
  15. func (this *BroadcasterTCPEventHook) InEvent(in rocommon.ProcEvent) rocommon.ProcEvent {
  16. switch inMsg := in.Msg().(type) {
  17. case *serverproto.ServiceTransmitAck:
  18. //log.Println("[BroadcasterTCPEventHook] recv transmit msgid,clientid", inMsg.MsgId, inMsg.ClientId)
  19. transmitMsg := &rocommon.TransmitPacket{
  20. MsgData: inMsg.MsgData,
  21. MsgId: inMsg.MsgId,
  22. SeqId: inMsg.SeqId,
  23. }
  24. if inMsg.ClientId != 0 {
  25. cliSession := model.GetClientSession(inMsg.ClientId)
  26. if cliSession != nil {
  27. cliSession.Send(transmitMsg)
  28. }
  29. //chybenchmark
  30. //cliUser := model.Session2User(cliSession)
  31. //if cliUser != nil {
  32. // cliUser.KvTestBossReward(int32(inMsg.MsgId))
  33. //}
  34. } else if inMsg.ClientIdList != nil { //广播给多个客户端
  35. for _, cid := range inMsg.ClientIdList {
  36. cliSession := model.GetClientSession(cid)
  37. if cliSession != nil {
  38. //todo...
  39. // 这边可以把消息序列化放到外层来处理,提升效率
  40. cliSession.Send(transmitMsg)
  41. }
  42. }
  43. }
  44. //已被处理,不再后传继续处理
  45. return nil
  46. }
  47. return in
  48. }
  49. //发送给后台服务器的消息
  50. func (this *BroadcasterTCPEventHook) OutEvent(out rocommon.ProcEvent) rocommon.ProcEvent {
  51. switch out.Msg().(type) {
  52. case *serverproto.ServiceTransmitAck:
  53. //log.Println("[BroadcasterTCPEventHook::OutEvent] send transmit msg:", outMsg)
  54. }
  55. return out
  56. }
  57. ///////////////////////////////////////////FrontendTCPEventHook
  58. //gate.frontend
  59. type FrontendTCPEventHook struct {
  60. }
  61. func (this *FrontendTCPEventHook) InEvent(in rocommon.ProcEvent) rocommon.ProcEvent {
  62. switch in.Msg().(type) {
  63. case *rocommon.SessionClosed:
  64. //通知后台客户端关闭,做一些关闭处理操作
  65. //这边需要注意如果 服务器主动把玩家kick后的操作
  66. //util.InfoF("[FrontendTCPEventHook::SessionClosed] %v", in.Session().ID())
  67. cliUser := model.Session2User(in.Session())
  68. if cliUser != nil {
  69. util.InfoF("FrontendTCPEventHook-SessionClosed cliId=%v", in.Session().ID())
  70. cliUser.Broadcast2Backend(&serverproto.ClientClosedACK{
  71. Id: uint64(in.Session().ID()),
  72. ServiceId: model.GateServiceID,
  73. })
  74. }
  75. case *rocommon.SessionAccepted:
  76. //util.InfoF("FrontendTCPEventHook-SessionConnected cliId=%v", in.Session().ID())
  77. //握手连接操作
  78. aesCodeStr := rpc.GetAESKey(16)
  79. handShakeNtf := &serverproto.SCHandShakeNtf{
  80. CryptPass: aesCodeStr,
  81. }
  82. in.Session().Send(handShakeNtf)
  83. in.Session().SetAES(aesCodeStr)
  84. remoteIPStr := ""
  85. switch t := in.Session().Raw().(type) {
  86. case net.Conn:
  87. remoteIPStr = t.RemoteAddr().String()
  88. }
  89. util.InfoF("FrontendTCPEventHook-SessionConnected cliId=%v aescode=%v remoteIPStr=%v", in.Session().ID(), aesCodeStr, remoteIPStr)
  90. }
  91. return in
  92. }
  93. func (this *FrontendTCPEventHook) OutEvent(out rocommon.ProcEvent) rocommon.ProcEvent {
  94. //todo...
  95. return out
  96. }