From 08fcc72b6d3b0df278baced225785d1fbf381d1a Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Thu, 16 Oct 2025 18:59:38 +0000 Subject: [PATCH] =?UTF-8?q?```feat(socket):=20=E5=AE=8C=E5=96=84=E8=B8=A2?= =?UTF-8?q?=E4=BA=BA=E6=B5=81=E7=A8=8B=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0CloseChan=E7=A1=AE=E4=BF=9D=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=9D=E5=AD=98=E5=AE=8C=E6=88=90```?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/rpc/rpc.go | 3 ++- common/socket/ServerEvent.go | 8 +++++++- common/socket/kick.go | 5 +++-- logic/controller/login.go | 7 ++++++- logic/service/player/player.go | 1 + logic/service/player/server.go | 4 +++- 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/common/rpc/rpc.go b/common/rpc/rpc.go index 838945e63..36626e806 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 db389bdc4..48a3b054e 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 33b7b9324..99cc86bc1 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 1b3ac708c..69d090e1b 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 e01d30fa3..98a118f0d 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 8a1806ac0..ca98d4d6c 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 } }