From dbf326e751d737771ffe73548eb8d2d3e37e391e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Fri, 10 Oct 2025 23:59:54 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(socket):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E4=BC=98=E9=9B=85=E9=80=80=E5=87=BA?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 Server 结构体中新增 quit 字段,并在 OnTick 方法中检查该字段, 若为 true 则调用 os.Exit(0) 实现程序正常退出。同时清理了 controller 中 冗余的导入和无用逻辑,优化 server 启动流程并修复 RPC 客户端传递错误问题。 ``` --- common/socket/ServerEvent.go | 5 +++++ common/socket/ServerOption.go | 1 + common/socket/kick.go | 19 ++++++++++++++++ logic/controller/controller.go | 41 +++++----------------------------- logic/server.go | 14 +++++------- 5 files changed, 36 insertions(+), 44 deletions(-) create mode 100644 common/socket/kick.go diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 64f6773b..0b4d4206 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "os" "sync/atomic" "time" @@ -60,6 +61,10 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { } func (s *Server) OnTick() (delay time.Duration, action gnet.Action) { cool.Loger.Infof(context.Background(), "[connected-count=%v]", atomic.LoadInt64(&s.connected)) + if s.quit { + //执行正常退出逻辑 + os.Exit(0) + } return 10 * time.Second, gnet.None } func (s *Server) OnBoot(eng gnet.Engine) gnet.Action { diff --git a/common/socket/ServerOption.go b/common/socket/ServerOption.go index 55a559c9..01a5bd14 100644 --- a/common/socket/ServerOption.go +++ b/common/socket/ServerOption.go @@ -23,6 +23,7 @@ type Server struct { codec codec.SocketCodec handler Handler discorse bool + quit bool } type Option func(*Server) diff --git a/common/socket/kick.go b/common/socket/kick.go new file mode 100644 index 00000000..a8431094 --- /dev/null +++ b/common/socket/kick.go @@ -0,0 +1,19 @@ +package socket + +import ( + "blazing/logic/service/player" + "fmt" +) + +func (h *Server) KickPerson(a int) error { + + fmt.Println("检测到踢人请求", a) + player.KickPlayer(uint32(a)) + return nil +} +func (h *Server) QuitSelf(a int) error { + //TODO 这里待退出 + fmt.Println("检测到退出请求") + h.quit = true + return nil +} diff --git a/logic/controller/controller.go b/logic/controller/controller.go index b20c6e5b..73338c08 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -6,9 +6,7 @@ import ( "blazing/cool" "blazing/logic/service/player" - "os" "strings" - "time" "bytes" "context" @@ -22,6 +20,11 @@ import ( ) var Maincontroller = NewController() //注入service + +func NewController() *Controller { + return &Controller{} +} + // 分发cmd逻辑实现Controller type Controller struct { Port uint16 @@ -32,40 +35,6 @@ type Controller struct { } } -type LogicClient struct { -} - -func (h *LogicClient) KickPerson(a int) error { - - fmt.Println("检测到踢人请求", a) - player.KickPlayer(uint32(a)) - return nil -} -func (h *LogicClient) QuitSelf(a int) error { - //TODO 这里待退出 - fmt.Println("检测到退出请求") - - go func() { - - for { - - //entity.ConutPlayer() - fmt.Println("当前在线人数", player.ConutPlayer()) - - if player.ConutPlayer() <= 0 { - //执行退出逻辑 - os.Exit(1) - } - <-time.After(5 * time.Second) - } - }() - //service.KickPlayer(uint32(a)) - return nil -} -func NewController() *Controller { - return &Controller{} -} - func ParseCmd[T any](a T, data []byte) T { // := info.NewLoginSidInfo() struc.Unpack(bytes.NewBuffer(data), &a) diff --git a/logic/server.go b/logic/server.go index ded81716..bc47dd4d 100644 --- a/logic/server.go +++ b/logic/server.go @@ -82,21 +82,19 @@ func Start(serverid uint16) { if err != nil { log.Fatalf("Failed to determine port: %v", err) } + ser := socket.NewServer( + socket.WithCORS(), + socket.WithPort(port), + socket.WithSocketHandler(head)) // go func() { - t := rpc.StartClient(serverid, uint16(port), new(controller.LogicClient)) + t := rpc.StartClient(serverid, uint16(port), ser) controller.Maincontroller.RPCClient = *t //将RPC赋值Start controller.Maincontroller.Port = uint16(port) //赋值服务器ID blservice.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port), t) - socket. - NewServer( - socket.WithCORS(), - socket.WithPort(port), - - socket.WithSocketHandler(head)). - Boot() + ser.Boot() } else { go rpc.StartServer()