feat(common): 重构数据包处理逻辑并添加全局 ID 生成器

- 引入 idgenerator-go 库,实现全局唯一 ID 生成
- 重构 Pack 函数,使用接口参数提高灵活性
- 修改 Player 结构,增加 MainConn 字段用于主连接
- 更新 SocketHandler_Tomee 中的 Data 字段标记
- 优化 Recv 函数中的数据解包和参数处理逻辑
This commit is contained in:
2025-06-27 22:40:49 +08:00
parent e25fe776eb
commit 741ef6ebd4
19 changed files with 214 additions and 94 deletions

View File

@@ -2,6 +2,7 @@ package controller
import (
"blazing/common/core"
"blazing/common/data/entity"
"blazing/common/socket/cmd"
"blazing/common/socket/handler"
"blazing/logic/service"
@@ -94,8 +95,8 @@ func getcmd(t reflect.Type) cmd.EnumCommandID {
// fmt.Printf("结构体 %s 的字段信息:\n", t.Name())
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
// fmt.Printf("- 字段名: %s\n", field.Name)
//fmt.Printf("- 字段名: %s\n", field.Name)
//fmt.Printf(" 类型: %v\n", field.Type)
if field.Type == reflect.TypeOf(handler.TomeeHeader{}) {
// fmt.Println(reflect.ValueOf(field))
@@ -134,39 +135,51 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) {
params := []reflect.Value{}
funct := cmdlister.Type().NumIn()
//funct := cmdlister.Type().NumIn()
// 如果需要可设置的变量(用于修改值),创建指针并解引用
ptrValue := reflect.New(cmdlister.Type().In(0))
struc.Unpack(bytes.NewBuffer(data.Data), ptrValue)
// ttt := cmdlister.Type().In(0)
tt1 := ptrValue.Elem().Addr().Interface()
// fmt.Println(tt1)
err := struc.Unpack(bytes.NewBuffer(data.Data), tt1)
if err != nil {
fmt.Println(err)
}
//fmt.Println(tt1)
ptrValue1 := ptrValue.Elem()
switch funct {
case 1:
// struc.Unpack(bytes.NewBuffer(data), &a)
// return a
params = append(params, ptrValue1)
// 设置 Name 字段
nameField := ptrValue.Elem().Field(0) //首个为header
if nameField.IsValid() && nameField.CanSet() {
nameField.Set(reflect.ValueOf(data))
}
if cmdlister.Type().In(1) == reflect.TypeOf(entity.Player{}) {
case 2:
params = append(params, ptrValue1, reflect.ValueOf(service.GetPlayer(c, data.UserID)))
} else {
params = append(params, ptrValue1, reflect.ValueOf(c))
}
ret := cmdlister.Call(params)
//return core.Pack(data.Handler.UserID, data.Handler.CMD, t1, 0)
//core.Pack(c, cmd cmd.EnumCommandID, data any, iserror uint32)
switch ret[0].Interface().(type) { //TODO 待修改
case []byte: //原始包
c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用
//case uint32: //错误码 实际上这里包含在结构体里了 ,错误码应该构造在返回之前
default:
var data1 bytes.Buffer
struc.Pack(&data1, &data)
c.Write(data1.Bytes())
_, err = c.Write(ret[0].Interface().([]byte))
if err != nil {
fmt.Println(err)
}
// switch ret[0].Interface().(type) { //TODO 待修改
// case []byte: //原始包
// c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用
// //case uint32: //错误码 实际上这里包含在结构体里了 ,错误码应该构造在返回之前
// default:
// var data1 bytes.Buffer
// struc.Pack(&data1, &data)
// c.Write(data1.Bytes())
// }
}