refactor(logic): 重构逻辑处理和错误处理机制

- 新增 Conn 结构体的 NewConn 工厂方法
- 优化 Controller 中的 Recv 方法,增加错误处理逻辑
- 修改 GetServer、Login、MapHot 等方法的返回值类型
- 重构 SystemTimeInfo 方法,使用新的 OutInfo 接口
- 更新 CommendSvrInfo 结构体和相关方法
- 统一错误处理机制,使用新的 OutInfo 接口
This commit is contained in:
2025-07-25 22:50:08 +08:00
parent 487b25ac2f
commit 449552bea7
10 changed files with 73 additions and 76 deletions

View File

@@ -13,6 +13,9 @@ type Conn struct {
MainConn gnet.Conn `struc:"[0]pad"` //TODO 不序列化,,序列化下面的作为blob存数据库
}
func NewConn(c gnet.Conn) *Conn {
return &Conn{MainConn: c}
}
func (c *Conn) SendPack(bytes []byte) error {
if c.MainConn.Context().(*ClientData).Getwsmsg().Upgraded {
// This is the echo server

View File

@@ -13,6 +13,7 @@ import (
"fmt"
"reflect"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
@@ -96,10 +97,6 @@ func init() { //默认初始化扫描
glog.Warning(context.Background(), "方法参数必须是结构体", method.Name, "跳过注册")
continue
}
// if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(func_cmd)) {
// fmt.Println("ID方法存在cmd未注册", func_cmd)
// }
if cool.Config.PortBL == 0 && func_cmd > 1000 { //判断login服务器
break
@@ -144,13 +141,10 @@ func getcmd(t reflect.Type) uint32 {
return gconv.Uint32(field.Tag.Get("cmd"))
}
// fmt.Printf(" 类型: %v\n", field.Type)
// fmt.Printf(" 标签: %q\n", field.Tag)
// 递归处理嵌套结构体
if field.Type.Kind() == reflect.Struct ||
(field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct) {
fmt.Println(" 嵌套结构体字段:")
nestedType := field.Type
if nestedType.Kind() == reflect.Ptr {
nestedType = nestedType.Elem()
@@ -207,19 +201,26 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) {
params = append(params, ptrValue1, reflect.ValueOf(c))
}
ret :=cmdlister.Call(params)
ret := cmdlister.Call(params)
r := entity.Conn{MainConn: c}
r := entity.NewConn(c) //这里实现新增客户端
if len(ret)<=0 {
if len(ret) <= 0 { //如果判断没有参数,那就说明这个包没有返回参数
return
}
a,ok:=ret[0].Interface().([]byte)
if ok {
r.SendPack(a)
aa, ok := ret[1].Interface().(service.OutInfo) //判断错误
if ok && aa != nil { //这里实现回复错误包
g.Log().Error(context.Background(), aa.Error(), aa.Code())
data.Result = uint32(aa.Code())
r.SendPack(data.Pack(nil))
return
}
r.SendPack(data.Pack(ret[0].Interface()))
}

View File

@@ -1,14 +1,17 @@
package controller
import (
"blazing/logic/service"
"blazing/logic/service/server"
"github.com/panjf2000/gnet/v2"
)
// 处理命令: 105
func (h Controller) GetServer(data *server.SidInfo, c gnet.Conn) { //这个时候player应该是空的
data.Def() //初始化方法,然后可以返回默认返回值修改
func (h Controller) GetServer(data *server.SidInfo, c gnet.Conn) (result *server.CommendSvrInfo, err service.OutInfo) { //这个时候player应该是空的
result = server.NewCommendSvrInfo()
result.ServerList = server.GetServerInfoList()
return
//return //TODO 这里待实现改成接口调用Ret方法
}

View File

@@ -4,13 +4,13 @@ import (
"blazing/common/data/share"
"blazing/logic/service"
"blazing/logic/service/login"
"time"
"blazing/logic/service/maps"
"github.com/panjf2000/gnet/v2"
)
// 处理命令: 1001
func (h *Controller) Login(data *login.LoginSidInfo, c gnet.Conn) []byte { //这个时候player应该是空的
func (h *Controller) Login(data *login.LoginSidInfo, c gnet.Conn) (result *maps.MapHotOutboundInfo, err service.OutInfo) { //这个时候player应该是空的
if tt := data.CheakSession(); tt { //说明sid正确
h.RPCClient.Kick(data.Head.UserID) //先踢人
@@ -20,11 +20,8 @@ func (h *Controller) Login(data *login.LoginSidInfo, c gnet.Conn) []byte { //这
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
t.CompleteLogin() //通知客户端登录成功
<-time.After(3000)
return data.Def()
c.Write(data.Def()) //TODO 这里实现fake数据
}
//data.Def()
//return //t1, _ := hex.DecodeString("000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000")
return nil
// return t1
return
}

View File

@@ -2,10 +2,11 @@ package controller
import (
"blazing/common/data/entity"
"blazing/logic/service"
"blazing/logic/service/maps"
)
func (h Controller) MapHot(data *maps.MapHotInboundInfo, c *entity.Player) (result *maps.MapHotOutboundInfo, err error) {
func (h Controller) MapHot(data *maps.MapHotInboundInfo, c *entity.Player) (result *maps.MapHotOutboundInfo, err service.OutInfo) {
data.Def()
result = &maps.MapHotOutboundInfo{
@@ -13,4 +14,5 @@ func (h Controller) MapHot(data *maps.MapHotInboundInfo, c *entity.Player) (resu
HotInfos: make([]maps.MapHotInfo, 0),
}
return
}

View File

@@ -2,11 +2,11 @@ package controller
import (
"blazing/common/data/entity"
"blazing/logic/service/system"
"blazing/logic/service"
"blazing/logic/service/SystemTime"
)
func (h Controller) SystemTimeInfo(data *system.SystemTimeInfo, c *entity.Player) {
data.Def()
//fmt.Println("登录成功")
//log.Printf("任务 %s 执行中,已登录状态: %v\n", , lw.IsLoggedIn())
func (h Controller) SystemTimeInfo(data *SystemTime.InInfo, c *entity.Player) (result *SystemTime.OutInfo, err service.OutInfo) {
result = SystemTime.NewOutInfo()
return
}

View File

@@ -0,0 +1,24 @@
package SystemTime
import (
"blazing/common/socket/handler"
"time"
)
// LoginSidInfo 登录携带的凭证结构体
type InInfo struct { //这里直接使用组合来实现将传入的原始头部数据和结构体参数序列化
Head handler.TomeeHeader `cmd:"1002" struc:"[0]pad"` //玩家登录
}
// OutInfo 表示系统时间的出站消息
type OutInfo struct {
SystemTime uint32 `json:"systemTime"` // 对应Java的@UInt long类型
}
// NewOutInfo 创建新的系统时间消息实例
func NewOutInfo() *OutInfo {
return &OutInfo{
SystemTime: uint32(time.Now().Unix()), // 获取当前时间戳(秒)
}
}

View File

@@ -20,15 +20,8 @@ type SidInfo struct { //这里直接使用组合来实现将传入的原始头
// ErrorPassWord uint32 `struc:"[0]pad"`
}
func (s *SidInfo) Def() []byte { //默认返回方法
r := newCommendSvrInfo()
r.ServerList = GetServerInfoList()
return s.Head.Pack(r) //返回传参
}
// CommendSvrInfo 初始连接请求信息结构体
type commendSvrInfo struct {
type CommendSvrInfo struct {
//Handler handler.TomeeHeader //` struc:"[0]pad"` //消息头 ,这里为传入的头部数据,遍历此头部实现解析CommendSvrInfo
MaxOnlineID uint32 `struc:"sizeof=ServerList"` // 最大连接数
IsVip uint32 // 建议为0
@@ -43,8 +36,8 @@ type commendSvrInfo struct {
// NewCommendSvrInfo 创建并返回一个新的 commendSvrInfo 结构体实例
// 返回的实例包含初始化的 ServerList、FriendInfo 和 BlackInfo 切片
// IsVip 和 ServerInfoLen 字段被初始化为 0
func newCommendSvrInfo() *commendSvrInfo {
return &commendSvrInfo{
func NewCommendSvrInfo() *CommendSvrInfo {
return &CommendSvrInfo{
// Handler: handler.TomeeHeader{},
// MaxOnlineID: 100,
IsVip: 0,

View File

@@ -60,7 +60,11 @@ func SetPlayer(c gnet.Conn, userid uint32) *entity.Player { //TODO 这里待优
// return nil
}
type OutboundInfo interface {
error //实现错误接口
Code()
/**
* @var type OutboundInf
* @global
*/
type OutInfo interface {
error //实现错误接口
Code() errorcode.ErrorCode //返回错误码,如果error不等于nil就返回这个实现对前台传错误码
}

View File

@@ -1,30 +0,0 @@
package system
import (
"blazing/common/socket/handler"
"time"
)
// LoginSidInfo 登录携带的凭证结构体
type SystemTimeInfo struct { //这里直接使用组合来实现将传入的原始头部数据和结构体参数序列化
Head handler.TomeeHeader `cmd:"1002" struc:"[0]pad"` //玩家登录
}
func (s *SystemTimeInfo) Def()[]byte { //默认返回方法
return s.Head.Pack(NewSystemTimeOutboundInfo) //返回传参
}
// SystemTimeOutboundInfo 表示系统时间的出站消息
type SystemTimeOutboundInfo struct {
SystemTime uint32 `json:"systemTime"` // 对应Java的@UInt long类型
}
// NewSystemTimeOutboundInfo 创建新的系统时间消息实例
func NewSystemTimeOutboundInfo() *SystemTimeOutboundInfo {
return &SystemTimeOutboundInfo{
SystemTime: uint32(time.Now().Unix()), // 获取当前时间戳(秒)
}
}