"refactor(network): 重构连接处理逻辑,使用自定义Conn类型替代gnet.Conn依赖"

This commit is contained in:
1
2025-07-26 02:14:54 +00:00
parent 99318f6674
commit 459a779591
5 changed files with 17 additions and 27 deletions

View File

@@ -1,13 +1,10 @@
package entity
import (
"context"
"fmt"
"sync"
"time"
"github.com/panjf2000/gnet/v2"
)
type Player struct {
@@ -28,9 +25,9 @@ func WithUserID(userID uint32) PlayerOption {
p.UserID = userID
}
}
func WithConn(c gnet.Conn) PlayerOption {
func WithConn(c Conn) PlayerOption {
return func(p *Player) {
p.MainConn = Conn{MainConn: c}
p.MainConn = c
}
}
@@ -54,8 +51,6 @@ func (p *Player) SendPack(b []byte) error {
return err
}
// IsLoggedIn 检查是否已登录
func (lw *Player) IsLoggedIn() bool {
lw.mu.Lock()

View File

@@ -1,6 +1,7 @@
package handler
import (
"blazing/common/data/entity"
"blazing/common/utils/bytearray"
"bytes"
@@ -34,7 +35,7 @@ func NewTomeeHeader() *TomeeHeader {
}
type TomeeHandler struct {
Callback func(conn gnet.Conn, data TomeeHeader)
Callback func(conn *entity.Conn, data TomeeHeader)
}
func NewTomeeHandler() *TomeeHandler {
@@ -57,7 +58,7 @@ func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的
header.Result, _ = tempdata.ReadUInt32()
header.Data = tempdata.BytesAvailable()
//fmt.Println("接收封包", header)
h.Callback(c, header)
h.Callback( entity.NewConn(c), header)
//return header
}
@@ -116,7 +117,6 @@ func (h *TomeeHeader) Pack(data any) []byte { //组包
}
// var _ Blazingservice = (*TomeeHeader)(nil)
// type Blazingservice interface {

View File

@@ -18,7 +18,6 @@ import (
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
"github.com/lunixbochs/struc"
"github.com/panjf2000/gnet/v2"
)
var Maincontroller = NewController() //注入service
@@ -160,7 +159,7 @@ func getcmd(t reflect.Type) uint32 {
}
// 遍历结构体方法并执行RECV_cmd
func Recv(c gnet.Conn, data handler.TomeeHeader) {
func Recv(c *entity.Conn, data handler.TomeeHeader) {
cmdlister, ok := cool.CmdCache.Load(data.CMD)
if !ok {
@@ -209,7 +208,7 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) {
if len(ret) <= 0 { //如果判断没有参数,那就说明这个包没有返回参数
return
}
r := entity.NewConn(c) //这里实现新增客户端
aa, ok := ret[1].Interface().(service.OutInfo) //判断错误
if ok && aa != nil { //这里实现回复错误包
@@ -217,11 +216,11 @@ func Recv(c gnet.Conn, data handler.TomeeHeader) {
g.Log().Error(context.Background(), aa.Error(), aa.Code())
data.Result = uint32(aa.Code())
r.SendPack(data.Pack(nil))
c.SendPack(data.Pack(nil))
return
}
r.SendPack(data.Pack(ret[0].Interface()))
c.SendPack(data.Pack(ret[0].Interface()))
}

View File

@@ -5,12 +5,10 @@ import (
"blazing/common/data/share"
"blazing/logic/service"
"blazing/logic/service/login"
"github.com/panjf2000/gnet/v2"
)
// 处理命令: 1001
func (h *Controller) Login(data *login.InInfo, c gnet.Conn) (result *login.OutInfo, err service.OutInfo) { //这个时候player应该是空的
func (h *Controller) Login(data *login.InInfo, c *entity.Conn) (result *login.OutInfo, err service.OutInfo) { //这个时候player应该是空的
if tt := data.CheakSession(); tt { //说明sid正确
h.RPCClient.Kick(data.Head.UserID) //先踢人
@@ -21,8 +19,8 @@ func (h *Controller) Login(data *login.InInfo, c gnet.Conn) (result *login.OutIn
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
t.CompleteLogin() //通知客户端登录成功
r := entity.NewConn(c) //这里实现新增客户端
r.SendPack(data.Def())
c.SendPack(data.Def())
} else {
err = &login.LoginErr{}

View File

@@ -5,15 +5,13 @@ import (
"blazing/common/socket/errorcode"
"blazing/common/socket/handler"
"blazing/cool"
"github.com/panjf2000/gnet/v2"
)
func GetPlayer(c gnet.Conn, userid uint32) *entity.Player { //TODO 这里待优化,可能存在内存泄漏问题
func GetPlayer(c *entity.Conn, userid uint32) *entity.Player { //TODO 这里待优化,可能存在内存泄漏问题
//检查player初始化是否为conn初始后取map防止二次连接后存在两个player
clientdata := c.Context().(*entity.ClientData)
clientdata := c.MainConn.Context().(*entity.ClientData)
if clientdata.GetPlayer() != nil {
return clientdata.GetPlayer()
}
@@ -44,13 +42,13 @@ func KickPlayer(userid uint32) { //踢出玩家
//return player
// return nil
}
func SetPlayer(c gnet.Conn, userid uint32) *entity.Player { //TODO 这里待优化,
func SetPlayer(c *entity.Conn, userid uint32) *entity.Player { //TODO 这里待优化,
clientdata := c.Context().(*entity.ClientData)
clientdata := c.MainConn.Context().(*entity.ClientData)
player := entity.NewPlayer(
entity.WithUserID(userid), //注入ID
entity.WithConn(c), //注入conn
entity.WithConn(*c), //注入conn
)
cool.Mainplayer.Store(userid, player)