| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package model
- import (
- "net"
- "rocommon"
- "rocommon/rpc"
- "rocommon/util"
- "roserver/baseserver/model"
- "roserver/serverproto"
- )
- ///////////////////////////////////////////BroadcasterTCPEventHook
- //gate.backend
- type BroadcasterTCPEventHook struct {
- }
- //来自后台服务器的消息
- func (this *BroadcasterTCPEventHook) InEvent(in rocommon.ProcEvent) rocommon.ProcEvent {
- switch inMsg := in.Msg().(type) {
- case *serverproto.ServiceTransmitAck:
- //log.Println("[BroadcasterTCPEventHook] recv transmit msgid,clientid", inMsg.MsgId, inMsg.ClientId)
- transmitMsg := &rocommon.TransmitPacket{
- MsgData: inMsg.MsgData,
- MsgId: inMsg.MsgId,
- SeqId: inMsg.SeqId,
- }
- if inMsg.ClientId != 0 {
- cliSession := model.GetClientSession(inMsg.ClientId)
- if cliSession != nil {
- cliSession.Send(transmitMsg)
- }
- //chybenchmark
- //cliUser := model.Session2User(cliSession)
- //if cliUser != nil {
- // cliUser.KvTestBossReward(int32(inMsg.MsgId))
- //}
- } else if inMsg.ClientIdList != nil { //广播给多个客户端
- for _, cid := range inMsg.ClientIdList {
- cliSession := model.GetClientSession(cid)
- if cliSession != nil {
- //todo...
- // 这边可以把消息序列化放到外层来处理,提升效率
- cliSession.Send(transmitMsg)
- }
- }
- }
- //已被处理,不再后传继续处理
- return nil
- }
- return in
- }
- //发送给后台服务器的消息
- func (this *BroadcasterTCPEventHook) OutEvent(out rocommon.ProcEvent) rocommon.ProcEvent {
- switch out.Msg().(type) {
- case *serverproto.ServiceTransmitAck:
- //log.Println("[BroadcasterTCPEventHook::OutEvent] send transmit msg:", outMsg)
- }
- return out
- }
- ///////////////////////////////////////////FrontendTCPEventHook
- //gate.frontend
- type FrontendTCPEventHook struct {
- }
- func (this *FrontendTCPEventHook) InEvent(in rocommon.ProcEvent) rocommon.ProcEvent {
- switch in.Msg().(type) {
- case *rocommon.SessionClosed:
- //通知后台客户端关闭,做一些关闭处理操作
- //这边需要注意如果 服务器主动把玩家kick后的操作
- //util.InfoF("[FrontendTCPEventHook::SessionClosed] %v", in.Session().ID())
- cliUser := model.Session2User(in.Session())
- if cliUser != nil {
- util.InfoF("FrontendTCPEventHook-SessionClosed cliId=%v", in.Session().ID())
- cliUser.Broadcast2Backend(&serverproto.ClientClosedACK{
- Id: uint64(in.Session().ID()),
- ServiceId: model.GateServiceID,
- })
- }
- case *rocommon.SessionAccepted:
- //util.InfoF("FrontendTCPEventHook-SessionConnected cliId=%v", in.Session().ID())
- //握手连接操作
- aesCodeStr := rpc.GetAESKey(16)
- handShakeNtf := &serverproto.SCHandShakeNtf{
- CryptPass: aesCodeStr,
- }
- in.Session().Send(handShakeNtf)
- in.Session().SetAES(aesCodeStr)
- remoteIPStr := ""
- switch t := in.Session().Raw().(type) {
- case net.Conn:
- remoteIPStr = t.RemoteAddr().String()
- }
- util.InfoF("FrontendTCPEventHook-SessionConnected cliId=%v aescode=%v remoteIPStr=%v", in.Session().ID(), aesCodeStr, remoteIPStr)
- }
- return in
- }
- func (this *FrontendTCPEventHook) OutEvent(out rocommon.ProcEvent) rocommon.ProcEvent {
- //todo...
- return out
- }
|