"refactor(network): 重构连接处理逻辑,使用自定义Conn类型替代gnet.Conn依赖"
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()))
|
||||
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user