diff --git a/common/rpc/rpc.go b/common/rpc/rpc.go index 838945e6..36626e80 100644 --- a/common/rpc/rpc.go +++ b/common/rpc/rpc.go @@ -29,7 +29,8 @@ type ServerHandler struct{} // 实现踢人 func (h *ServerHandler) Kick(ctx context.Context, userid uint32) error { - + + cool.Loger.Info(context.TODO(),"服务器收到踢人" ) useid1, err := share.ShareManager.GetUserOnline(userid) if err != nil { diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index db389bdc..48a3b054 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -42,6 +42,7 @@ func (s *Server) Stop() error { } func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { + defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) @@ -52,8 +53,13 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { v, ok := c.Context().(*player.ClientData) if ok && v.Player != nil { - + cool.Loger.Info(context.TODO(), "准备保存", v.Player.Info.UserID) v.Player.Save() //保存玩家数据 + cool.Loger.Info(context.TODO(), "保存完成", v.Player.Info.UserID) + if v.CloseChan != nil { + close(v.CloseChan) + } + } //} diff --git a/common/socket/kick.go b/common/socket/kick.go index 33b7b932..99cc86bc 100644 --- a/common/socket/kick.go +++ b/common/socket/kick.go @@ -1,13 +1,14 @@ package socket import ( + "blazing/cool" "blazing/logic/service/player" + "context" "fmt" ) func (h *Server) KickPerson(a int) error { - - fmt.Println("检测到踢人请求", a) + cool.Loger.Info(context.TODO(), "检测到踢人请求", a) return player.KickPlayer(uint32(a)) } diff --git a/logic/controller/login.go b/logic/controller/login.go index 1b3ac708..69d090e1 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -2,6 +2,7 @@ package controller import ( "blazing/common/data/share" + "blazing/cool" "fmt" "blazing/common/socket/errorcode" @@ -35,11 +36,15 @@ func IsToday(t time.Time) bool { func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 if tt := data.CheakSession(); tt { //说明sid正确 + cool.Loger.Info(context.TODO(), "准备踢人") err := h.RPCClient.Kick(data.Head.UserID) //先踢人 if err != nil { fmt.Println("踢人失败", err) } - <-time.After(time.Millisecond * 3000) + //player.KickPlayer(data.Head.UserID) + cool.Loger.Info(context.TODO(), "踢人请求完成,继续登录流程") + + // <-time.After(time.Millisecond * 3000) share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器 t := player.GetPlayer(c, data.Head.UserID) t.Service = blservice.NewUserService(data.Head.UserID) diff --git a/logic/service/player/player.go b/logic/service/player/player.go index e01d30fa..98a118f0 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -44,6 +44,7 @@ type ClientData struct { Mu sync.Mutex ERROR_CONNUT int Wsmsg *WsCodec + CloseChan chan struct{} } func NewClientData() *ClientData { diff --git a/logic/service/player/server.go b/logic/service/player/server.go index 8a1806ac..ca98d4d6 100644 --- a/logic/service/player/server.go +++ b/logic/service/player/server.go @@ -41,11 +41,13 @@ func KickPlayer(userid uint32) error { //踢出玩家 //实际上这里有个问题,会造成重复保存问题 player1.SendPack(head.Pack(nil)) - + player1.MainConn.Context().(*ClientData).CloseChan = make(chan struct{}) player1.MainConn.Context().(*ClientData).Mu.Lock() player1.MainConn.Close() player1.MainConn.Context().(*ClientData).Mu.Unlock() // clientdata.Player = player + + <-player1.MainConn.Context().(*ClientData).CloseChan } }