Files
bl/common/socket/ServerOption.go

117 lines
2.6 KiB
Go
Raw Normal View History

2025-06-20 17:00:56 +08:00
package socket
import (
"blazing/common/socket/codec"
"blazing/common/socket/errorcode"
"blazing/logic/service"
2025-06-20 17:00:56 +08:00
"github.com/gogf/gf/v2/util/gconv"
2025-06-20 17:00:56 +08:00
"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)
}
2025-06-20 17:00:56 +08:00
type Server struct {
gnet.BuiltinEventEngine
eng gnet.Engine
addr string
connected int64
2025-06-20 17:00:56 +08:00
network string
multicore bool
bufferSize int
workerPool *goroutine.Pool
codec codec.SocketCodec
handler Handler
2025-06-24 22:09:05 +08:00
discorse bool
2025-06-20 17:00:56 +08:00
}
type Option func(*Server)
// NewServer returns a new Server
func NewServer(options ...Option) *Server {
server := &Server{
// handler: handler.NewTomeeHandler(), //请求返回
2025-06-20 17:00:56 +08:00
codec: codec.NewTomeeSocketCodec(), //默认解码器 len+pack
workerPool: goroutine.Default(),
bufferSize: 4096, //默认缓冲区大小
multicore: true,
2025-06-24 22:09:05 +08:00
discorse: true,
2025-06-20 17:00:56 +08:00
}
for _, option := range options {
option(server)
}
//...
return server
}
func WithSocketCodec(codec codec.SocketCodec) Option {
return func(u *Server) {
u.codec = codec
}
}
2025-06-24 22:09:05 +08:00
func WithCORS() Option {
return func(u *Server) {
u.discorse = false
}
}
func WithSocketHandler(handler Handler) Option {
2025-06-20 17:00:56 +08:00
return func(u *Server) {
u.handler = handler
}
}
func WithBufferSize(bufferSize int) Option {
return func(u *Server) {
u.bufferSize = bufferSize
}
}
func WithPort(port int) Option {
2025-06-20 17:00:56 +08:00
return func(s *Server) {
s.network = "tcp"
s.addr = ":" + gconv.String(port)
2025-06-20 17:00:56 +08:00
}
}