diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index e50210c8..f20902f3 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -181,6 +181,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) { } func (s *Server) parser(c gnet.Conn, line []byte) { + c.Context().(*player.ClientData).IsCrossDomain = true //todo 这里待实现注入player实体 s.handler.Handle(c, line) diff --git a/logic/controller/CreatePlayer.go b/logic/controller/CreatePlayer.go index e0037173..1a82b9c5 100644 --- a/logic/controller/CreatePlayer.go +++ b/logic/controller/CreatePlayer.go @@ -10,10 +10,12 @@ import ( "blazing/logic/service/user" blservice "blazing/modules/blazing/service" "strings" + + "github.com/panjf2000/gnet/v2" ) // 处理命令: 1001 -func (h *Controller) CreatePlayer(data *user.CreatePlayerInboundInfo, c *player.Conn) (result *user.CreatePlayerOutInfo, err errorcode.ErrorCode) { +func (h *Controller) CreatePlayer(data *user.CreatePlayerInboundInfo, c gnet.Conn) (result *user.CreatePlayerOutInfo, err errorcode.ErrorCode) { blservice.NewUserService(data.Head.UserID).Reg(cool.Filter.Replace(data.Nickname, '*'), data.Color) return result, 0 diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 73338c08..97730c28 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -17,6 +17,7 @@ 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 @@ -127,7 +128,7 @@ func getcmd(t reflect.Type) []uint32 { } // 遍历结构体方法并执行RECV_cmd -func Recv(c *player.Conn, data player.TomeeHeader) { +func Recv(c gnet.Conn, data player.TomeeHeader) { cmdlister, ok := cool.CmdCache.Load(data.CMD) if !ok { @@ -188,14 +189,17 @@ func Recv(c *player.Conn, data player.TomeeHeader) { if ok && aa != 0 { //这里实现回复错误包 cool.Loger.Error(context.Background(), aa.Code()) - - c.SendPack(data.Pack(nil)) + c.Context().(*player.ClientData).Mu.Lock() + c.Write(data.Pack(nil)) + c.Context().(*player.ClientData).Mu.Unlock() return } data.Version = "7" //glog.Debug(context.Background(), data.CMD, "回复数据") - c.SendPack(data.Pack(ret[0].Interface())) + c.Context().(*player.ClientData).Mu.Lock() + c.Write(data.Pack(ret[0].Interface())) + c.Context().(*player.ClientData).Mu.Unlock() } diff --git a/logic/controller/getserver.go b/logic/controller/getserver.go index 70334402..fa8b6765 100644 --- a/logic/controller/getserver.go +++ b/logic/controller/getserver.go @@ -3,12 +3,13 @@ package controller import ( "blazing/common/socket/errorcode" - "blazing/logic/service/player" "blazing/logic/service/user" + + "github.com/panjf2000/gnet/v2" ) // 处理命令: 105 -func (h *Controller) COMMEND_ONLINE(data *user.SidInfo, c *player.Conn) (result *user.CommendSvrInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 +func (h *Controller) COMMEND_ONLINE(data *user.SidInfo, c gnet.Conn) (result *user.CommendSvrInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 result = user.NewInInfo() result.ServerList = user.GetServerInfoList() return diff --git a/logic/controller/login.go b/logic/controller/login.go index 67ffd6d7..163d673e 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -17,6 +17,7 @@ import ( "github.com/gogf/gf/v2/os/glog" "github.com/jinzhu/copier" + "github.com/panjf2000/gnet/v2" ) func IsToday(t time.Time) bool { @@ -30,7 +31,7 @@ func IsToday(t time.Time) bool { } // 处理命令: 1001 -func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c *player.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 +func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 if tt := data.CheakSession(); tt { //说明sid正确 h.RPCClient.Kick(data.Head.UserID) //先踢人 diff --git a/logic/controller/nano.go b/logic/controller/nano.go index 8c8300d4..b048f3d0 100644 --- a/logic/controller/nano.go +++ b/logic/controller/nano.go @@ -3,11 +3,12 @@ package controller import ( "blazing/common/socket/errorcode" "blazing/logic/service/nono" - "blazing/logic/service/player" + + "github.com/panjf2000/gnet/v2" ) // 处理命令: 105 -func (h *Controller) NonoFollowOrHome(data *nono.NonoFollowOrHomeInInfo, c *player.Conn) (result *nono.NonoFollowOutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 +func (h *Controller) NonoFollowOrHome(data *nono.NonoFollowOrHomeInInfo, c gnet.Conn) (result *nono.NonoFollowOutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &nono.NonoFollowOutInfo{ diff --git a/logic/service/player/SocketHandler_Tomee.go b/logic/service/player/SocketHandler_Tomee.go index 88613a1f..c9bec538 100644 --- a/logic/service/player/SocketHandler_Tomee.go +++ b/logic/service/player/SocketHandler_Tomee.go @@ -36,7 +36,7 @@ func NewTomeeHeader(cmd uint32, userid uint32) *TomeeHeader { } type TomeeHandler struct { - Callback func(conn *Conn, data TomeeHeader) + Callback func(conn gnet.Conn, data TomeeHeader) } func NewTomeeHandler() *TomeeHandler { @@ -58,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(NewConn(c), header) + h.Callback(c, header) //return header } diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 838c1c92..0e0fcfcb 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -26,6 +26,7 @@ import ( "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/util/gconv" "github.com/panjf2000/gnet/pkg/logging" + "github.com/panjf2000/gnet/v2" ) func ConutPlayer() int { @@ -41,9 +42,9 @@ func ConutPlayer() int { type ClientData struct { IsCrossDomain bool //是否跨域过 Player *Player //客户实体 - //UserID uint32 - ERROR_CONNUT int - Wsmsg *WsCodec + Mu sync.Mutex + ERROR_CONNUT int + Wsmsg *WsCodec } func NewClientData() *ClientData { @@ -58,35 +59,6 @@ func NewClientData() *ClientData { } var Mainplayer = &utils.SyncMap[uint32, *Player]{} //玩家数据 -func (c *Conn) Close() { - c.Mu.Lock() - defer c.Mu.Unlock() - c.MainConn.Close() - -} -func (c *Conn) SendPack(bytes []byte) error { - c.Mu.Lock() - defer c.Mu.Unlock() - if t, ok := c.MainConn.Context().(*ClientData); ok { - if t.Wsmsg.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 { - glog.Debug(context.Background(), err) - - } - } - } - - return nil -} type OgreInfo struct { Data [9]OgrePetInfo @@ -99,7 +71,7 @@ type OgrePetInfo struct { } type Player struct { - MainConn *Conn + MainConn gnet.Conn baseplayer IsLogin bool //是否登录 mu sync.Mutex @@ -123,7 +95,7 @@ type Player struct { // PlayerOption 定义配置 Player 的函数类型 type PlayerOption func(*Player) -func WithConn(c *Conn) PlayerOption { +func WithConn(c gnet.Conn) PlayerOption { return func(p *Player) { p.MainConn = c } @@ -260,9 +232,26 @@ func (p *Player) ItemAdd(t []model.SingleItemInfo) { } func (p *Player) SendPack(b []byte) error { - // fmt.Println("发送数据包", len(b)) - err := p.MainConn.SendPack(b) - return err + p.MainConn.Context().(*ClientData).Mu.Lock() + defer p.MainConn.Context().(*ClientData).Mu.Unlock() + + if p.MainConn.Context().(*ClientData).Wsmsg.Upgraded { + // This is the echo server + err := wsutil.WriteServerMessage(p.MainConn, ws.OpBinary, b) + if err != nil { + logging.Infof("conn[%v] [err=%v]", p.MainConn.RemoteAddr().String(), err.Error()) + return err + } + } else { + + _, err := p.MainConn.Write(b) + if err != nil { + glog.Debug(context.Background(), err) + + } + } + + return nil } func (p *Player) Cheak(b error) { diff --git a/logic/service/player/server.go b/logic/service/player/server.go index 9b7f8f89..8d9f27d6 100644 --- a/logic/service/player/server.go +++ b/logic/service/player/server.go @@ -1,12 +1,16 @@ package player -import "blazing/common/socket/errorcode" +import ( + "blazing/common/socket/errorcode" -func GetPlayer(c *Conn, userid uint32) *Player { //TODO 这里待优化,可能存在内存泄漏问题 + "github.com/panjf2000/gnet/v2" +) + +func GetPlayer(c gnet.Conn, userid uint32) *Player { //TODO 这里待优化,可能存在内存泄漏问题 //检查player初始化,是否为conn初始后取map,防止二次连接后存在两个player - clientdata := c.MainConn.Context().(*ClientData) + clientdata := c.Context().(*ClientData) if clientdata.Player == nil { clientdata.Player = NewPlayer( @@ -35,9 +39,11 @@ func KickPlayer(userid uint32) { //踢出玩家 head := NewTomeeHeader(1001, userid) head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere) //实际上这里有个问题,会造成重复保存问题 - + player1.MainConn.Context().(*ClientData).Mu.Lock() player1.SendPack(head.Pack(nil)) + player1.MainConn.Close() + player1.MainConn.Context().(*ClientData).Mu.Unlock() // clientdata.Player = player } diff --git a/logic/service/player/wscodec.go b/logic/service/player/wscodec.go index 9d52e4af..9a7270f2 100644 --- a/logic/service/player/wscodec.go +++ b/logic/service/player/wscodec.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "io" - "sync" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" @@ -12,15 +11,6 @@ import ( "github.com/panjf2000/gnet/v2/pkg/logging" ) -type Conn struct { - MainConn gnet.Conn `struc:"[0]pad"` //TODO 不序列化,,序列化下面的作为blob存数据库 - Mu sync.Mutex -} - -func NewConn(c gnet.Conn) *Conn { - return &Conn{MainConn: c} -} - type WsCodec struct { Tcp bool Upgraded bool // 链接是否升级