From 008701d3de34b31cb6160796b9192b06c6125ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sat, 1 Nov 2025 01:08:47 +0800 Subject: [PATCH] =?UTF-8?q?```=20fix(player):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E5=8F=91=E9=80=81=E6=95=B0=E6=8D=AE=E5=8C=85?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E7=A9=BA=E6=8C=87=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 `ClientData` 中的 `sync.Mutex` 替换为 `sync.RWMutex` 以支持读写锁 - 在 `ServerEvent.go` 中添加读锁保护对客户端数据的访问 - 增加对 `MainConn` 及其上下文是否存在判断,防止空指针引用 ``` --- common/socket/ServerEvent.go | 2 ++ logic/service/player/SocketHandler_Tomee.go | 2 +- logic/service/player/player.go | 10 +++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index d56ba6b7..57f61d44 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -151,7 +151,9 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { t := c.Context().(*player.ClientData) //client := conn.RemoteAddr().String() s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 + t.Mu.RLock() t.OnEvent(msg.Payload) + t.Mu.RUnlock() }) diff --git a/logic/service/player/SocketHandler_Tomee.go b/logic/service/player/SocketHandler_Tomee.go index 534db64b..a9e695d3 100644 --- a/logic/service/player/SocketHandler_Tomee.go +++ b/logic/service/player/SocketHandler_Tomee.go @@ -199,7 +199,7 @@ func (h *ClientData) Recv(data TomeeHeader) { type ClientData struct { IsCrossDomain bool //是否跨域过 Player *Player //客户实体 - Mu sync.Mutex + Mu sync.RWMutex ERROR_CONNUT int Wsmsg *WsCodec Conn gnet.Conn diff --git a/logic/service/player/player.go b/logic/service/player/player.go index d7e5458e..86a50576 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -106,7 +106,15 @@ func (p *Player) SpawnMonsters() { } func (p *Player) SendPack(b []byte) error { - return p.MainConn.Context().(*ClientData).SendPack(b) + if p.MainConn == nil { + return nil + } + _, ok := p.MainConn.Context().(*ClientData) + if ok { + return p.MainConn.Context().(*ClientData).SendPack(b) + } + + return nil }