refactor(common): 重构 Pack 函数并优化数据处理

- 重构了 Pack 函数,支持处理不同类型的 data 参数
- 优化了数据打包过程,使用反射处理结构体和切片
- 修改了 TomeeHeader 结构体,使用 EnumCommandID 类型
- 调整了 login 相关的结构体定义
- 优化了 main 函数中的数据处理逻辑
This commit is contained in:
2025-06-27 00:30:15 +08:00
parent feabc7153a
commit e25fe776eb
7 changed files with 76 additions and 90 deletions

View File

@@ -1,67 +1,71 @@
package core package core
import ( import (
"blazing/common/serialize/bytearray"
"blazing/common/socket/cmd" "blazing/common/socket/cmd"
"blazing/common/socket/handler" "blazing/common/socket/handler"
"bytes" "bytes"
"fmt"
"reflect"
"github.com/lunixbochs/struc" "github.com/lunixbochs/struc"
"github.com/panjf2000/gnet"
) )
func SendError(cmd cmd.EnumCommandID, data any) { //TODO发送错误码的实现 func Pack(userid uint32, cmd cmd.EnumCommandID, data any, iserror uint32) []byte { //组包
//序列化结构体取错误码,然后构造错误结构 t := reflect.TypeOf(data)
tv := reflect.ValueOf(data)
var datar []byte
//SEND ERROR 方法通过error tag取到标签然后error库内取参数 // 处理指针类型
if t.Kind() == reflect.Ptr {
t = t.Elem() // 获取指针指向的类型
tv = tv.Elem() // 获取指针指向的值
}
//.Println(t.Kind())
//t1 := tv.Interface()
//fmt.Println(t1)
switch t.Kind() {
} case reflect.Slice:
datar = data.([]byte)
//p.Conn.Write(p.pack(cmd, data.([]byte))) //写入数据
func SendPack(c gnet.Conn, cmd cmd.EnumCommandID, data any) { //TODO 待测试 case reflect.Struct:
var data1 bytes.Buffer
err := struc.Pack(&data1, data)
if err != nil {
fmt.Println(err)
}
//t := reflect.TypeOf(data) datar = data1.Bytes()
// var datar []byte // fmt.Println(err, datar)
// var iserror uint32 = 0 // p.Conn.Write(p.pack(cmd, data))
// switch t.Kind() {
// case reflect.Slice:
// datar = data.([]byte)
// //p.Conn.Write(p.pack(cmd, data.([]byte))) //写入数据
// case reflect.Struct: }
// var data1 bytes.Buffer
// struc.Pack(&data1, &data)
// datar = data1.Bytes()
// // p.Conn.Write(p.pack(cmd, data))
// case reflect.Uint32: //说明是错误码
// iserror = data.(uint32)
// default:
// // 可选:处理 nil 数据情况,直接返回
// datar = nil
// return
// }
//c.Write(pack(packhead(userid uint32, cmd cmd.EnumCommandID, data []byte, iserror uint32)))
}
func Pack(userid uint32, cmd cmd.EnumCommandID, data []byte, iserror uint32) []byte { //组包
head1 := handler.TomeeHeader{ head1 := handler.TomeeHeader{
Len: uint32(len(data) + 17), Len: uint32(len(datar) + 17),
CMD: uint32(cmd), CMD: cmd,
Version: "7", Version: "7",
UserID: userid, UserID: userid,
Result: iserror, Result: iserror,
Data: data, Data: datar,
} }
if iserror != 0 { //如果存在错误码 if iserror != 0 { //如果存在错误码
head1.Data = nil head1.Data = nil
} }
var data1 bytes.Buffer //var data1 bytes.Buffer
struc.Pack(&data1, &head1) //.Pack(&data1, &head1)
return data1.Bytes() by := bytearray.CreateByteArray()
by.WriteUInt32(head1.Len)
by.WriteString(head1.Version)
by.WriteUInt32(uint32(head1.CMD))
by.WriteUInt32(head1.UserID)
by.WriteUInt32(head1.Result)
by.Write(datar)
return by.Bytes()
} }

View File

@@ -2,20 +2,21 @@ package handler
import ( import (
"blazing/common/serialize/bytearray" "blazing/common/serialize/bytearray"
"blazing/common/socket/cmd"
"github.com/panjf2000/gnet/v2" "github.com/panjf2000/gnet/v2"
) )
// TomeeHeader 结构体字段定义 // TomeeHeader 结构体字段定义
type TomeeHeader struct { type TomeeHeader struct {
Len uint32 `json:"len"` Len uint32 `json:"len"`
Version string `json:"version" struc:"[1]byte"` Version string `json:"version" struc:"[1]byte"`
CMD uint32 `json:"cmdId"` CMD cmd.EnumCommandID `json:"cmdId" struc:"uint32"`
UserID uint32 `json:"userId"` UserID uint32 `json:"userId"`
//Error uint32 `json:"error" struc:"[0]pad"` //Error uint32 `json:"error" struc:"[0]pad"`
Result uint32 `json:"result"` Result uint32 `json:"result"`
Data []byte `json:"data"` //组包忽略此字段// struc:"[0]pad" Data []byte `json:"data" struc:"[0]pad"` //组包忽略此字段// struc:"[0]pad"
} }
type TomeeHandler struct { type TomeeHandler struct {
Callback func(conn gnet.Conn, data TomeeHeader) Callback func(conn gnet.Conn, data TomeeHeader)
@@ -34,7 +35,8 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的
tempdata := bytearray.CreateByteArray(data) tempdata := bytearray.CreateByteArray(data)
header.Len, _ = tempdata.ReadUInt32() header.Len, _ = tempdata.ReadUInt32()
header.Version, _ = tempdata.ReadString(1) header.Version, _ = tempdata.ReadString(1)
header.CMD, _ = tempdata.ReadUInt32() _CMD, _ := tempdata.ReadUInt32()
header.CMD = cmd.EnumCommandID(_CMD)
header.UserID, _ = tempdata.ReadUInt32() header.UserID, _ = tempdata.ReadUInt32()
header.Result, _ = tempdata.ReadUInt32() header.Result, _ = tempdata.ReadUInt32()

View File

@@ -52,16 +52,19 @@ func init() { //默认初始化扫描
// 获取方法值 // 获取方法值
methodValue := value.MethodByName(method.Name) methodValue := value.MethodByName(method.Name)
methodValue.Type().NumIn() methodValue.Type().NumIn()
var func_cmd uint32 var func_cmd cmd.EnumCommandID
//params := []reflect.Value{} //params := []reflect.Value{}
//fmt.Println(methodValue.Type().NumIn()) //fmt.Println(methodValue.Type().NumIn())
for i := 0; i < methodValue.Type().NumIn(); i++ { // for i := 0; i < methodValue.Type().NumIn(); i++ {
ttt := methodValue.Type().In(i) // ttt := methodValue.Type().In(i)
func_cmd = gconv.Uint32(getcmd(ttt)) // func_cmd = getcmd(ttt)
} // }
// /ttt := methodValue.Type().In(0)
func_cmd = getcmd(methodValue.Type().In(0))
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(func_cmd)) { if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(func_cmd)) {
fmt.Println("ID方法存在cmd未注册", func_cmd) fmt.Println("ID方法存在cmd未注册", func_cmd)
@@ -150,7 +153,9 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) {
} }
ret := cmdlister.Call(params) ret := cmdlister.Call(params)
switch ret[0].Interface().(type) {
//core.Pack(c, cmd cmd.EnumCommandID, data any, iserror uint32)
switch ret[0].Interface().(type) { //TODO 待修改
case []byte: //原始包 case []byte: //原始包
c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用 c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用

View File

@@ -1,6 +1,7 @@
package controller package controller
import ( import (
"blazing/common/core"
"blazing/logic/service/login" "blazing/logic/service/login"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
@@ -11,7 +12,7 @@ func (h Controller) Login(data login.LoginSidInfo) interface{} { //这个时候p
fmt.Println(login.CheakSession(data)) //检查结构体 fmt.Println(login.CheakSession(data)) //检查结构体
t1, _ := hex.DecodeString("0000045D37000003E9000186A600000000000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000") t1, _ := hex.DecodeString("000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000")
return core.Pack(data.Handler.UserID, data.Handler.CMD, t1, 0)
return t1 return t1
} }

View File

@@ -11,7 +11,7 @@ import (
// LoginSidInfo 登录携带的凭证结构体 // LoginSidInfo 登录携带的凭证结构体
type LoginSidInfo struct { //这里直接使用组合来实现将传入的原始头部数据和结构体参数序列化 type LoginSidInfo struct { //这里直接使用组合来实现将传入的原始头部数据和结构体参数序列化
handler.TomeeHeader `cmd:"1001" struc:"[0]pad"` Handler handler.TomeeHeader `cmd:"1001" `
Sid []byte `struc:"[16]byte"` // 登录会话ID固定长度16字节 Sid []byte `struc:"[16]byte"` // 登录会话ID固定长度16字节
// NotLogin uint32 `error="10001"|struc:"[0]pad"` //返回错误码 ,不序列化,仅作为错误码 // NotLogin uint32 `error="10001"|struc:"[0]pad"` //返回错误码 ,不序列化,仅作为错误码
@@ -26,7 +26,7 @@ func CheakSession(c LoginSidInfo) bool {
t2 := strings.Trim(t1, " ") t2 := strings.Trim(t1, " ")
t, err := cool.CacheManager.Get(context.Background(), t2) t, err := cool.CacheManager.Get(context.Background(), t2)
fmt.Println("后端获取", string(c.Sid), t, err) fmt.Println("后端获取", string(c.Sid), t, err)
if t.Uint32() == c.UserID { if t.Uint32() == c.Handler.UserID {
return true return true
} }

View File

@@ -1,15 +1,13 @@
package login package login
import "blazing/common/socket/handler"
// CommendSvrInfo 初始连接请求信息结构体 // CommendSvrInfo 初始连接请求信息结构体
type CommendSvrInfo struct { type CommendSvrInfo struct {
Handler handler.TomeeHeader ` struc:"[0]pad"` //消息头 ,这里为传入的头部数据,遍历此头部实现解析CommendSvrInfo //Handler handler.TomeeHeader //` struc:"[0]pad"` //消息头 ,这里为传入的头部数据,遍历此头部实现解析CommendSvrInfo
MaxOnlineID uint32 // 最大连接数 MaxOnlineID uint32 // 最大连接数
IsVip uint32 // 建议为0 IsVip uint32 // 建议为0
ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo
ServerList []ServerInfo // 服务器具体信息 ServerList []ServerInfo // 服务器具体信息
Reversed uint32 // 保留字段 Reversed uint32 // 保留字段
} }
func NewCommendSvrInfo() *CommendSvrInfo { func NewCommendSvrInfo() *CommendSvrInfo {

View File

@@ -1,14 +1,13 @@
package main package main
import ( import (
"bytes"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
_ "github.com/gogf/gf/contrib/nosql/redis/v2" _ "github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/lunixbochs/struc"
"github.com/panjf2000/gnet/v2" "github.com/panjf2000/gnet/v2"
"blazing/common/core"
"blazing/common/socket" "blazing/common/socket"
"blazing/common/socket/handler" "blazing/common/socket/handler"
_ "blazing/contrib/files/local" _ "blazing/contrib/files/local"
@@ -48,9 +47,6 @@ func Start(port string) {
func recv(c gnet.Conn, data handler.TomeeHeader) { func recv(c gnet.Conn, data handler.TomeeHeader) {
//fmt.Println(data)
//t, _ := cool.CacheManager.Get(context.Background(), data.Data)
// fmt.Println(t.String())
ret := login.NewCommendSvrInfo() ret := login.NewCommendSvrInfo()
lofin := login.NewServerInfo() lofin := login.NewServerInfo()
@@ -62,28 +58,8 @@ func recv(c gnet.Conn, data handler.TomeeHeader) {
ret.ServerList = append(ret.ServerList, *lofin) ret.ServerList = append(ret.ServerList, *lofin)
var trr bytes.Buffer tt := core.Pack(data.UserID, data.CMD, ret, 0)
t11, _ := struc.Sizeof(ret) fmt.Println(hex.EncodeToString(tt))
ret.Handler = handler.TomeeHeader{ c.Write(tt)
Len: uint32(t11),
CMD: 105,
Version: "7",
UserID: 1,
// Data: bytt.Bytes(),
}
err := struc.Pack(&trr, ret)
fmt.Println(err)
//0000003f3700000001000000000000006900000000
//0000003f37000000690000000100000000
//0000003F3700000069000186A600000000
fmt.Println(hex.EncodeToString(trr.Bytes()))
// c.Write(trr1.Bytes())
c.Write(trr.Bytes())
// 处理接收到的TomeeHeader数据
// fmt.Println("收到数据:", data)
//processWithReflection(data)
} }