```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

refactor(socket): 移除重复保存锁并优化panic错误处理

移除了ServerEvent.go中的sync.Once保存锁,因为可能存在重复保存问题,
同时将panic错误处理从fmt.Println改为使用cool.Logger.Error进行统一日志记录

feat(player): 优化踢人功能并添加超时机制

移除kick.go中的复杂异步超时逻辑
This commit is contained in:
昔念
2026-02-02 23:11:14 +08:00
parent cdb7cec4ad
commit b25f033939
8 changed files with 36 additions and 79 deletions

View File

@@ -65,11 +65,7 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
v, _ := c.Context().(*player.ClientData)
v.LF.Close()
if v.Player != nil {
v.SaveL.Do(func() { //使用保存锁,确保在踢人和掉线的时候只保存一次
v.Player.Save() //保存玩家数据
})
v.Player.Save() //保存玩家数据
}
@@ -110,7 +106,7 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
fmt.Println(context.TODO(), "panic 错误:", err)
cool.Logger.Error(context.TODO(), "panic 错误:", err)
}
}()

View File

@@ -4,7 +4,6 @@ import (
"blazing/common/socket/errorcode"
"blazing/logic/service/common"
"blazing/logic/service/player"
"blazing/modules/base/service"
"fmt"
"time"
)
@@ -34,25 +33,7 @@ func (s *Server) KickPerson(a int) error {
return nil
}
// 1. 创建结果通道
resultChan := make(chan error, 1)
// 2. 启动 goroutine 执行踢人操作
go func() {
err := player.KickPlayer(uint32(a))
resultChan <- err
}()
// 3. 用 select 监听结果和超时信号
select {
case err := <-resultChan:
// 正常完成
return err
case <-time.After(kickTimeout):
service.NewBaseSysLogService().RecordKick(uint32(a), fmt.Errorf("踢人操作超时(超时时间:%v", kickTimeout).Error())
// 超时触发,返回自定义或内置超时错误
return fmt.Errorf("踢人操作超时(超时时间:%v", kickTimeout)
}
return player.KickPlayer(uint32(a))
}
// 参数不为0是强制踢出