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 }