From 68d1a1355e2a3d53b2fcd28786883db74d74d379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Tue, 14 Oct 2025 14:25:57 +0800 Subject: [PATCH] =?UTF-8?q?```=20fix(controller):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=B9=B6=E5=8F=91=E5=86=99=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原先直接操作连接上下文并加锁的写法, 改为通过 player 实例封装的 SendPack 方法发送数据, 提高代码可维护性和安全性。 同时调整了 service 层踢出玩家时锁的获取顺序, 确保在关闭连接前 --- logic/controller/controller.go | 12 ++++-------- logic/service/player/server.go | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 97730c28..5ba609ce 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -185,21 +185,17 @@ func Recv(c gnet.Conn, data player.TomeeHeader) { return } - + t := player.GetPlayer(c, data.UserID) if ok && aa != 0 { //这里实现回复错误包 cool.Loger.Error(context.Background(), aa.Code()) - c.Context().(*player.ClientData).Mu.Lock() - c.Write(data.Pack(nil)) - c.Context().(*player.ClientData).Mu.Unlock() + t.SendPack(data.Pack(nil)) + return } data.Version = "7" - //glog.Debug(context.Background(), data.CMD, "回复数据") - c.Context().(*player.ClientData).Mu.Lock() - c.Write(data.Pack(ret[0].Interface())) - c.Context().(*player.ClientData).Mu.Unlock() + t.SendPack(data.Pack(ret[0].Interface())) } diff --git a/logic/service/player/server.go b/logic/service/player/server.go index 8d9f27d6..1068cce9 100644 --- a/logic/service/player/server.go +++ b/logic/service/player/server.go @@ -39,9 +39,9 @@ func KickPlayer(userid uint32) { //踢出玩家 head := NewTomeeHeader(1001, userid) head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere) //实际上这里有个问题,会造成重复保存问题 - player1.MainConn.Context().(*ClientData).Mu.Lock() - player1.SendPack(head.Pack(nil)) + player1.SendPack(head.Pack(nil)) + player1.MainConn.Context().(*ClientData).Mu.Lock() player1.MainConn.Close() player1.MainConn.Context().(*ClientData).Mu.Unlock() // clientdata.Player = player