diff --git a/common/core/pack.go b/common/core/pack.go deleted file mode 100644 index 8d8ce9c5a..000000000 --- a/common/core/pack.go +++ /dev/null @@ -1,65 +0,0 @@ -package core - -import ( - "blazing/common/serialize/bytearray" - "blazing/common/socket/handler" - "bytes" - "fmt" - "reflect" - - "github.com/lunixbochs/struc" -) - -func Pack(header1 handler.TomeeHeader, data any) []byte { //组包 - header := header1 - //t := reflect.TypeOf(data) - tv := reflect.ValueOf(data) - var datar []byte - - // 处理指针类型 - if tv.Kind() == reflect.Ptr { - //tv = t.Elem() // 获取指针指向的类型 - tv = tv.Elem() // 获取指针指向的值 - } - //.Println(t.Kind()) - //t1 := tv.Interface() - //fmt.Println(t1) - switch tv.Kind() { - - case reflect.Slice: - datar = data.([]byte) - //p.Conn.Write(p.pack(cmd, data.([]byte))) //写入数据 - - case reflect.Struct: - var data1 bytes.Buffer - err := struc.Pack(&data1, data) - if err != nil { - fmt.Println(err) - } - - datar = data1.Bytes() - - default: - datar = []byte{} - // fmt.Println(err, datar) - // p.Conn.Write(p.pack(cmd, data)) - - } - header.Len = uint32(len(datar) + 17) - - // if iserror != 0 { //如果存在错误码 - // head1.Data = nil - // } - //var data1 bytes.Buffer - //.Pack(&data1, &head1) - by := bytearray.CreateByteArray() - by.WriteUInt32(header.Len) - by.WriteString(header.Version) - by.WriteUInt32(uint32(header.CMD)) - by.WriteUInt32(header.UserID) - by.WriteUInt32(header.Result) - by.Write(datar) - - return by.Bytes() - -} diff --git a/common/data/entity/conn.go b/common/data/entity/conn.go new file mode 100644 index 000000000..33d8d6fcf --- /dev/null +++ b/common/data/entity/conn.go @@ -0,0 +1,32 @@ +package entity + +import ( + "fmt" + + "github.com/gobwas/ws" + "github.com/gobwas/ws/wsutil" + "github.com/panjf2000/gnet/v2" + "github.com/panjf2000/gnet/v2/pkg/logging" +) + +type Conn struct { + MainConn gnet.Conn `struc:"[0]pad"` //TODO 不序列化,,序列化下面的作为blob存数据库 +} + +func (c *Conn) SendPack(bytes []byte) error { + if c.MainConn.Context().(*ClientData).Getwsmsg().Upgraded { + // This is the echo server + err := wsutil.WriteServerMessage(c.MainConn, ws.OpBinary, bytes) + if err != nil { + logging.Infof("conn[%v] [err=%v]", c.MainConn.RemoteAddr().String(), err.Error()) + return err + } + } else { + + _, err := c.MainConn.Write(bytes) + if err != nil { + fmt.Println(err) + } + } + return nil +} diff --git a/common/data/entity/player.go b/common/data/entity/player.go index e4e31dd92..1a7b720a9 100644 --- a/common/data/entity/player.go +++ b/common/data/entity/player.go @@ -7,9 +7,9 @@ import ( ) type Player struct { - MainConn gnet.Conn `struc:"[0]pad"` //TODO 不序列化,,序列化下面的作为blob存数据库 - UserID uint32 //用户ID - IsLogin bool //是否登录 //TODO 待实现登录包为第一个包,后续再发其他的包 + MainConn Conn + UserID uint32 //用户ID + IsLogin bool //是否登录 //TODO 待实现登录包为第一个包,后续再发其他的包 } @@ -22,9 +22,9 @@ func WithUserID(userID uint32) PlayerOption { p.UserID = userID } } -func WithConn(Conn gnet.Conn) PlayerOption { +func WithConn(c gnet.Conn) PlayerOption { return func(p *Player) { - p.MainConn = Conn + p.MainConn = Conn{MainConn: c} } } @@ -42,7 +42,7 @@ func (p *Player) GetUserID() uint32 { } func (p *Player) SendPack(b []byte) error { - _, err := p.MainConn.Write(b) + err := p.MainConn.SendPack(b) return err } diff --git a/common/socket/handler/SocketHandler_Tomee.go b/common/socket/handler/SocketHandler_Tomee.go index 25e354793..181eec3b5 100644 --- a/common/socket/handler/SocketHandler_Tomee.go +++ b/common/socket/handler/SocketHandler_Tomee.go @@ -3,7 +3,11 @@ package handler import ( "blazing/common/serialize/bytearray" "blazing/common/socket/cmd" + "bytes" + "fmt" + "reflect" + "github.com/lunixbochs/struc" "github.com/panjf2000/gnet/v2" ) @@ -55,3 +59,51 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的 h.Callback(c, header) //return header } +func (h *TomeeHeader) Pack(data any) []byte { //组包 + + //t := reflect.TypeOf(data) + tv := reflect.ValueOf(data) + var datar []byte + + // 处理指针类型 + if tv.Kind() == reflect.Ptr { + //tv = t.Elem() // 获取指针指向的类型 + tv = tv.Elem() // 获取指针指向的值 + } + //.Println(t.Kind()) + //t1 := tv.Interface() + //fmt.Println(t1) + switch tv.Kind() { + + case reflect.Slice: + datar = data.([]byte) + //p.Conn.Write(p.pack(cmd, data.([]byte))) //写入数据 + + case reflect.Struct: + var data1 bytes.Buffer + err := struc.Pack(&data1, data) + if err != nil { + fmt.Println(err) + } + + datar = data1.Bytes() + + default: + datar = []byte{} + // fmt.Println(err, datar) + // p.Conn.Write(p.pack(cmd, data)) + + } + h.Len = uint32(len(datar) + 17) + + by := bytearray.CreateByteArray() + by.WriteUInt32(h.Len) + by.WriteString(h.Version) + by.WriteUInt32(uint32(h.CMD)) + by.WriteUInt32(h.UserID) + by.WriteUInt32(h.Result) + by.Write(datar) + + return by.Bytes() + +} diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 4127eaaca..97c7479aa 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -14,13 +14,10 @@ import ( "fmt" "reflect" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" "github.com/gogf/gf/v2/os/gcmd" "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/util/gconv" "github.com/lunixbochs/struc" - "github.com/panjf2000/gnet/pkg/logging" "github.com/panjf2000/gnet/v2" ) @@ -202,21 +199,8 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) { } 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) - if c.Context().(*entity.ClientData).Getwsmsg().Upgraded { - // This is the echo server - err = wsutil.WriteServerMessage(c, ws.OpBinary, ret[0].Interface().([]byte)) - if err != nil { - logging.Infof("conn[%v] [err=%v]", c.RemoteAddr().String(), err.Error()) - return - } - } else { - _, err = c.Write(ret[0].Interface().([]byte)) - if err != nil { - fmt.Println(err) - } - } + r := entity.Conn{c} + r.SendPack(ret[0].Interface().([]byte)) } diff --git a/logic/controller/getserver.go b/logic/controller/getserver.go index ff5366f73..4d9cd8cef 100644 --- a/logic/controller/getserver.go +++ b/logic/controller/getserver.go @@ -1,7 +1,6 @@ package controller import ( - "blazing/common/core" "blazing/logic/service/server" "github.com/panjf2000/gnet/v2" @@ -16,7 +15,7 @@ func (h Controller) GetServer(data server.SidInfo, c gnet.Conn) []byte { //这 ret.ServerList = server.GetServerInfoList() - tt := core.Pack(data.Head, ret) + tt := data.Head.Pack(ret) //fmt.Println(hex.EncodeToString(tt)) // c.Write(tt) return tt diff --git a/logic/controller/login.go b/logic/controller/login.go index fc065eb85..bb3c6a29f 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -1,7 +1,6 @@ package controller import ( - "blazing/common/core" "blazing/logic/service" "blazing/logic/service/login" "encoding/hex" @@ -27,8 +26,8 @@ func (h *Controller) Login(data login.LoginSidInfo, c gnet.Conn) []byte { //这 data.Head.Version = "7" data.Head.UserID = 99942 data.Head.Result = 0 - fmt.Println(core.Pack(data.Head, t1[17:])[:40]) - return core.Pack(data.Head, t1[17:]) + fmt.Println(data.Head.Pack(t1[17:])[:40]) + return data.Head.Pack(t1[17:])[:40] //return //t1, _ := hex.DecodeString("000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000") // return t1 diff --git a/logic/service/service.go b/logic/service/service.go index 2babdd723..c5786ff0a 100644 --- a/logic/service/service.go +++ b/logic/service/service.go @@ -37,7 +37,7 @@ func KickPlayer(userid uint32) { //踢出玩家 head.CMD = 1001 player.SendPack(core.Pack(*head, nil)) - player.MainConn.Close() + player.MainConn.MainConn.Close() // clientdata.Player = player }