From fdd55ed99bb8aacd7e6103fabb7ead6afcbbcb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Wed, 29 Oct 2025 23:51:03 +0800 Subject: [PATCH] =?UTF-8?q?```=20refactor(socket):=20=E7=A7=BB=E9=99=A4=20?= =?UTF-8?q?Lockfree=20=E4=BE=9D=E8=B5=96=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的基于 Lockfree 的消息队列机制移除,改为直接在协程池中调用客户端数据处理器。 同时调整了 `ClientData` 结构体和相关方法实现,使代码更简洁、易于维护。 此外,注释掉了一处调试日志输出,并修正了获取玩家对象的方式。 ``` --- common/socket/ServerEvent.go | 12 ++------- logic/service/player/SocketHandler_Tomee.go | 4 +-- logic/service/player/player.go | 30 ++++----------------- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index b8c4356b..046e1ba5 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -56,8 +56,6 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { v, _ := c.Context().(*player.ClientData) s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 - v.Lf.Close() //关闭lockfree - if v.Player != nil { //cool.Loger.Info(context.TODO(), "准备保存", v.Player.Info.UserID) v.Player.Save() //保存玩家数据 @@ -152,10 +150,7 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { t := c.Context().(*player.ClientData) //client := conn.RemoteAddr().String() err = s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 - err = t.Lf.Producer().Write(msg.Payload) - if err != nil { - panic(err) - } + t.OnEvent(msg.Payload) }) @@ -186,10 +181,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) { t := conn.Context().(*player.ClientData) err = s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 - err = t.Lf.Producer().Write(data) - if err != nil { - panic(err) - } + t.OnEvent(data) }) diff --git a/logic/service/player/SocketHandler_Tomee.go b/logic/service/player/SocketHandler_Tomee.go index 7f186f47..f79354ef 100644 --- a/logic/service/player/SocketHandler_Tomee.go +++ b/logic/service/player/SocketHandler_Tomee.go @@ -133,7 +133,7 @@ func Recv(c gnet.Conn, data TomeeHeader) { } // fmt.Println(cmdlister) - glog.Debug(context.Background(), "接收数据", data.UserID, data.CMD) + //glog.Debug(context.Background(), "接收数据", data.UserID, data.CMD) params := []reflect.Value{} //funct := cmdlister.Type().NumIn() @@ -182,7 +182,7 @@ func Recv(c gnet.Conn, data TomeeHeader) { return } - t := GetPlayer(c, data.UserID) + t := clientdata.Player if t == nil { return } diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 2ff08cd5..5058091c 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -25,7 +25,6 @@ import ( "time" "github.com/antlabs/timer" - "github.com/bruceshao/lockfree" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" "github.com/gogf/gf/v2/frame/g" @@ -55,45 +54,25 @@ type ClientData struct { Mu sync.Mutex ERROR_CONNUT int Wsmsg *WsCodec - Lf *lockfree.Lockfree[[]byte] + Conn gnet.Conn CloseChan chan struct{} } func NewClientData(c gnet.Conn) *ClientData { // 创建事件处理器 - handler := &eventHandler{ - Conn: c, - } - lfs := lockfree.NewConditionBlockStrategy() - // 创建消费端串行处理的Lockfree - lf := lockfree.NewLockfree[[]byte]( - 4096, - handler, - lfs, - ) - // 启动Lockfree - if err := lf.Start(); err != nil { - panic(err) - } cd := ClientData{ IsCrossDomain: false, Player: nil, - Lf: lf, - - Wsmsg: &WsCodec{}, + Conn: c, + Wsmsg: &WsCodec{}, } return &cd } -type eventHandler struct { - Callback func(conn gnet.Conn, data TomeeHeader) - Conn gnet.Conn -} - -func (h *eventHandler) OnEvent(v []byte) { +func (h *ClientData) OnEvent(v []byte) { defer func() { if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 // 1. 打印错误信息 @@ -409,6 +388,7 @@ func (p *Player) Save() { } if p.FightC != nil { + go p.FightC.Over(p, info.BattleOverReason.PlayerOffline) //玩家逃跑,但是不能锁线程 }