From f06638d6b672583016c82ffc23b13d76507c27be 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 03:19:32 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(socket):=20=E4=BC=98=E5=8C=96TCP?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E5=B9=B6?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E6=89=B9=E9=87=8F=E8=AF=BB=E5=8F=96=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 `ServerEvent.go` 中调整了 `OnTraffic` 方法的处理逻辑, 避免不必要的循环,确保跨域请求优先处理。 - 新增 `batchRead` 配置项,用于控制单次处理的最大数据包数量, 默认值设为 10。 - 修复 `OnClose` 方法中可能存在的执行顺序问题,并显式关闭 Lockfree 资源。 - 在 `ClientData` 初始化时,将 Lockfree 的阻塞策略从 Sleep 策略 替换为 ConditionBlock 策略,提升并发处理性能。 - 微调玩家登录完成时的地图ID判断条件,由 1000 --- common/socket/ServerEvent.go | 11 ++++++----- common/socket/ServerOption.go | 2 ++ logic/service/player/player.go | 12 +++++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 744766ad..b8c4356b 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -55,6 +55,7 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { //logging.Infof("conn[%v] disconnected", c.RemoteAddr().String()) v, _ := c.Context().(*player.ClientData) s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 + v.Lf.Close() //关闭lockfree if v.Player != nil { @@ -164,12 +165,12 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { } func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) { + if s.discorse && !conn.Context().(*player.ClientData).IsCrossDomain { + handle(conn) + } + conn.Context().(*player.ClientData).IsCrossDomain = true + for i := 0; i < s.batchRead; i++ { - for { - if s.discorse && !conn.Context().(*player.ClientData).IsCrossDomain { - handle(conn) - } - conn.Context().(*player.ClientData).IsCrossDomain = true data, err := s.codec.Decode(conn) if err == codec.ErrIncompletePacket { diff --git a/common/socket/ServerOption.go b/common/socket/ServerOption.go index 5b03b136..fd05ce46 100644 --- a/common/socket/ServerOption.go +++ b/common/socket/ServerOption.go @@ -24,6 +24,7 @@ type Server struct { handler Handler discorse bool quit bool + batchRead int } type Option func(*Server) @@ -37,6 +38,7 @@ func NewServer(options ...Option) *Server { workerPool: goroutine.Default(), bufferSize: 4096, //默认缓冲区大小 multicore: true, + batchRead: 10, //discorse: true, } for _, option := range options { diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 41b7640f..2ff08cd5 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -56,7 +56,8 @@ type ClientData struct { ERROR_CONNUT int Wsmsg *WsCodec Lf *lockfree.Lockfree[[]byte] - CloseChan chan struct{} + + CloseChan chan struct{} } func NewClientData(c gnet.Conn) *ClientData { @@ -64,12 +65,12 @@ func NewClientData(c gnet.Conn) *ClientData { handler := &eventHandler{ Conn: c, } - + lfs := lockfree.NewConditionBlockStrategy() // 创建消费端串行处理的Lockfree lf := lockfree.NewLockfree[[]byte]( 4096, handler, - lockfree.NewSleepBlockStrategy(time.Millisecond), + lfs, ) // 启动Lockfree @@ -80,7 +81,8 @@ func NewClientData(c gnet.Conn) *ClientData { IsCrossDomain: false, Player: nil, Lf: lf, - Wsmsg: &WsCodec{}, + + Wsmsg: &WsCodec{}, } return &cd @@ -432,7 +434,7 @@ func (p *Player) CanGetExp() bool { // CompleteLogin 标记登录完成并通知等待者 func (lw *Player) CompleteLogin() { - if lw.Info.MapID > 10000 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓 + if lw.Info.MapID > 500 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓 lw.Info.MapID = 1 }