Files
bl/common/socket/ServerOption.go
昔念 621a9d3858 refactor(socket): 重构 socket 模块
- 移除 common/data/socket 目录下的大部分文件
- 新增 service 目录,将 Player 和 Conn 结构体移至该目录
- 更新 LogicClient 中的方法签名,使用 service 包的类型
- 重构 Controller 中的方法,适应新的 service 包结构
2025-09-04 02:00:57 +08:00

117 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package socket
import (
"blazing/common/socket/codec"
"blazing/common/socket/errorcode"
"blazing/logic/service"
"github.com/gogf/gf/v2/util/gconv"
"github.com/panjf2000/gnet/pkg/pool/goroutine"
"github.com/panjf2000/gnet/v2"
)
func GetPlayer(c *service.Conn, userid uint32) *service.Player { //TODO 这里待优化,可能存在内存泄漏问题
c.Mu.Lock()
defer c.Mu.Unlock()
//检查player初始化是否为conn初始后取map防止二次连接后存在两个player
clientdata := c.MainConn.Context().(*service.ClientData)
if clientdata.Player != nil {
return clientdata.Player
}
clientdata.Player = service.NewPlayer(
service.WithConn(c), //注入conn
)
// gff := socket.NewClientData()
// gff.Player = clientdata.Player
// c.MainConn.SetContext(gff)
service.Mainplayer.Store(userid, clientdata.Player)
return clientdata.Player
// return nil
}
func KickPlayer(userid uint32) { //踢出玩家
//TODO 返回错误码
//var player *entity.Player
if player1, ok := service.Mainplayer.Load((userid)); ok {
//取成功,否则创建
head := service.NewTomeeHeader(1001, userid)
head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere)
player1.SendPack(head.Pack(nil))
player1.MainConn.MainConn.Close()
// clientdata.Player = player
}
//return player
// return nil
}
type Handler interface {
Handle(gnet.Conn, []byte)
}
type Server struct {
gnet.BuiltinEventEngine
eng gnet.Engine
addr string
connected int64
network string
multicore bool
bufferSize int
workerPool *goroutine.Pool
codec codec.SocketCodec
handler Handler
discorse bool
}
type Option func(*Server)
// NewServer returns a new Server
func NewServer(options ...Option) *Server {
server := &Server{
// handler: handler.NewTomeeHandler(), //请求返回
codec: codec.NewTomeeSocketCodec(), //默认解码器 len+pack
workerPool: goroutine.Default(),
bufferSize: 4096, //默认缓冲区大小
multicore: true,
discorse: true,
}
for _, option := range options {
option(server)
}
//...
return server
}
func WithSocketCodec(codec codec.SocketCodec) Option {
return func(u *Server) {
u.codec = codec
}
}
func WithCORS() Option {
return func(u *Server) {
u.discorse = false
}
}
func WithSocketHandler(handler Handler) Option {
return func(u *Server) {
u.handler = handler
}
}
func WithBufferSize(bufferSize int) Option {
return func(u *Server) {
u.bufferSize = bufferSize
}
}
func WithPort(port int) Option {
return func(s *Server) {
s.network = "tcp"
s.addr = ":" + gconv.String(port)
}
}