From e25fe776eb8cb93697c65b70ddd203a8cee45b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Fri, 27 Jun 2025 00:30:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor(common):=20=E9=87=8D=E6=9E=84=20Pack?= =?UTF-8?q?=20=E5=87=BD=E6=95=B0=E5=B9=B6=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构了 Pack 函数,支持处理不同类型的 data 参数 - 优化了数据打包过程,使用反射处理结构体和切片 - 修改了 TomeeHeader 结构体,使用 EnumCommandID 类型 - 调整了 login 相关的结构体定义 - 优化了 main 函数中的数据处理逻辑 --- common/core/pack.go | 80 ++++++++++---------- common/socket/handler/SocketHandler_Tomee.go | 14 ++-- logic/controller/controller.go | 17 +++-- logic/controller/login.go | 5 +- logic/service/login/in.go | 4 +- logic/service/login/out.go | 14 ++-- login/main.go | 32 +------- 7 files changed, 76 insertions(+), 90 deletions(-) diff --git a/common/core/pack.go b/common/core/pack.go index 93507d4e5..2d19424c6 100644 --- a/common/core/pack.go +++ b/common/core/pack.go @@ -1,67 +1,71 @@ package core import ( + "blazing/common/serialize/bytearray" "blazing/common/socket/cmd" "blazing/common/socket/handler" "bytes" + "fmt" + "reflect" "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) - // var datar []byte - // var iserror uint32 = 0 - // switch t.Kind() { - // case reflect.Slice: - // datar = data.([]byte) - // //p.Conn.Write(p.pack(cmd, data.([]byte))) //写入数据 + datar = data1.Bytes() + // fmt.Println(err, datar) + // p.Conn.Write(p.pack(cmd, data)) - // 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{ - Len: uint32(len(data) + 17), - CMD: uint32(cmd), + Len: uint32(len(datar) + 17), + CMD: cmd, Version: "7", UserID: userid, Result: iserror, - Data: data, + Data: datar, } if iserror != 0 { //如果存在错误码 head1.Data = nil } - var data1 bytes.Buffer - struc.Pack(&data1, &head1) - return data1.Bytes() + //var data1 bytes.Buffer + //.Pack(&data1, &head1) + 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() } diff --git a/common/socket/handler/SocketHandler_Tomee.go b/common/socket/handler/SocketHandler_Tomee.go index df93668cc..f0978c10f 100644 --- a/common/socket/handler/SocketHandler_Tomee.go +++ b/common/socket/handler/SocketHandler_Tomee.go @@ -2,20 +2,21 @@ package handler import ( "blazing/common/serialize/bytearray" + "blazing/common/socket/cmd" "github.com/panjf2000/gnet/v2" ) // TomeeHeader 结构体字段定义 type TomeeHeader struct { - Len uint32 `json:"len"` - Version string `json:"version" struc:"[1]byte"` - CMD uint32 `json:"cmdId"` - UserID uint32 `json:"userId"` + Len uint32 `json:"len"` + Version string `json:"version" struc:"[1]byte"` + CMD cmd.EnumCommandID `json:"cmdId" struc:"uint32"` + UserID uint32 `json:"userId"` //Error uint32 `json:"error" struc:"[0]pad"` Result uint32 `json:"result"` - Data []byte `json:"data"` //组包忽略此字段// struc:"[0]pad" + Data []byte `json:"data" struc:"[0]pad"` //组包忽略此字段// struc:"[0]pad" } type TomeeHandler struct { Callback func(conn gnet.Conn, data TomeeHeader) @@ -34,7 +35,8 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的 tempdata := bytearray.CreateByteArray(data) header.Len, _ = tempdata.ReadUInt32() header.Version, _ = tempdata.ReadString(1) - header.CMD, _ = tempdata.ReadUInt32() + _CMD, _ := tempdata.ReadUInt32() + header.CMD = cmd.EnumCommandID(_CMD) header.UserID, _ = tempdata.ReadUInt32() header.Result, _ = tempdata.ReadUInt32() diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 4666923ba..2532123d7 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -52,16 +52,19 @@ func init() { //默认初始化扫描 // 获取方法值 methodValue := value.MethodByName(method.Name) methodValue.Type().NumIn() - var func_cmd uint32 + var func_cmd cmd.EnumCommandID //params := []reflect.Value{} //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)) { fmt.Println("ID方法存在cmd未注册", func_cmd) @@ -150,7 +153,9 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) { } 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: //原始包 c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用 diff --git a/logic/controller/login.go b/logic/controller/login.go index 1e2b00000..ea898b7af 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -1,6 +1,7 @@ package controller import ( + "blazing/common/core" "blazing/logic/service/login" "encoding/hex" "fmt" @@ -11,7 +12,7 @@ func (h Controller) Login(data login.LoginSidInfo) interface{} { //这个时候p 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 } diff --git a/logic/service/login/in.go b/logic/service/login/in.go index fab345b96..fd7f3bc2c 100644 --- a/logic/service/login/in.go +++ b/logic/service/login/in.go @@ -11,7 +11,7 @@ import ( // LoginSidInfo 登录携带的凭证结构体 type LoginSidInfo struct { //这里直接使用组合来实现将传入的原始头部数据和结构体参数序列化 - handler.TomeeHeader `cmd:"1001" struc:"[0]pad"` + Handler handler.TomeeHeader `cmd:"1001" ` Sid []byte `struc:"[16]byte"` // 登录会话ID,固定长度16字节 // NotLogin uint32 `error="10001"|struc:"[0]pad"` //返回错误码 ,不序列化,仅作为错误码 @@ -26,7 +26,7 @@ func CheakSession(c LoginSidInfo) bool { t2 := strings.Trim(t1, " ") t, err := cool.CacheManager.Get(context.Background(), t2) fmt.Println("后端获取", string(c.Sid), t, err) - if t.Uint32() == c.UserID { + if t.Uint32() == c.Handler.UserID { return true } diff --git a/logic/service/login/out.go b/logic/service/login/out.go index 261443a9c..847ef1c63 100644 --- a/logic/service/login/out.go +++ b/logic/service/login/out.go @@ -1,15 +1,13 @@ package login -import "blazing/common/socket/handler" - // CommendSvrInfo 初始连接请求信息结构体 type CommendSvrInfo struct { - Handler handler.TomeeHeader ` struc:"[0]pad"` //消息头 ,这里为传入的头部数据,遍历此头部实现解析CommendSvrInfo - MaxOnlineID uint32 // 最大连接数 - IsVip uint32 // 建议为0 - ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo - ServerList []ServerInfo // 服务器具体信息 - Reversed uint32 // 保留字段 + //Handler handler.TomeeHeader //` struc:"[0]pad"` //消息头 ,这里为传入的头部数据,遍历此头部实现解析CommendSvrInfo + MaxOnlineID uint32 // 最大连接数 + IsVip uint32 // 建议为0 + ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo + ServerList []ServerInfo // 服务器具体信息 + Reversed uint32 // 保留字段 } func NewCommendSvrInfo() *CommendSvrInfo { diff --git a/login/main.go b/login/main.go index a3e069741..bd9d302b7 100644 --- a/login/main.go +++ b/login/main.go @@ -1,14 +1,13 @@ package main import ( - "bytes" "encoding/hex" "fmt" _ "github.com/gogf/gf/contrib/nosql/redis/v2" - "github.com/lunixbochs/struc" "github.com/panjf2000/gnet/v2" + "blazing/common/core" "blazing/common/socket" "blazing/common/socket/handler" _ "blazing/contrib/files/local" @@ -48,9 +47,6 @@ func Start(port string) { 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() lofin := login.NewServerInfo() @@ -62,28 +58,8 @@ func recv(c gnet.Conn, data handler.TomeeHeader) { ret.ServerList = append(ret.ServerList, *lofin) - var trr bytes.Buffer - t11, _ := struc.Sizeof(ret) - ret.Handler = handler.TomeeHeader{ - 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) + tt := core.Pack(data.UserID, data.CMD, ret, 0) + fmt.Println(hex.EncodeToString(tt)) + c.Write(tt) }