feat(common): 重构数据包处理逻辑并添加全局 ID 生成器
- 引入 idgenerator-go 库,实现全局唯一 ID 生成 - 重构 Pack 函数,使用接口参数提高灵活性 - 修改 Player 结构,增加 MainConn 字段用于主连接 - 更新 SocketHandler_Tomee 中的 Data 字段标记 - 优化 Recv 函数中的数据解包和参数处理逻辑
This commit is contained in:
@@ -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())
|
||||
|
||||
// }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user