```
refactor(controller): 优化控制器初始化与命令解析逻辑 - 重构 getCmd 和 ParseCmdTag
This commit is contained in:
154
logic/server.go
154
logic/server.go
@@ -1,77 +1,77 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/common/rpc"
|
||||
"blazing/common/socket"
|
||||
|
||||
"blazing/cool"
|
||||
"blazing/logic/controller"
|
||||
|
||||
blservice "blazing/modules/blazing/service"
|
||||
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
const (
|
||||
minRandomPort = 10000
|
||||
maxRandomPort = 60000
|
||||
maxPortRetryCount = 5
|
||||
)
|
||||
|
||||
var candidatePorts = cool.Config.GamePort
|
||||
|
||||
// determinePort 确定服务器使用的端口
|
||||
func determinePort() (int, error) {
|
||||
|
||||
// 尝试从指定端口列表中找可用端口,最多尝试maxPortRetryCount轮
|
||||
for i := 0; i < maxPortRetryCount; i++ {
|
||||
// 遍历指定的端口列表
|
||||
for _, port := range candidatePorts {
|
||||
if isPortAvailable(port) {
|
||||
return int(port), nil
|
||||
}
|
||||
log.Printf("Port %d is not available, checking next...", port)
|
||||
}
|
||||
log.Printf("All candidate ports are in use, retrying round %d...", i+1)
|
||||
}
|
||||
|
||||
return 0, fmt.Errorf("failed to find available port after %d rounds of checking", maxPortRetryCount)
|
||||
}
|
||||
|
||||
// isPortAvailable 检查端口是否可用
|
||||
func isPortAvailable(port uint64) bool {
|
||||
address := fmt.Sprintf(":%d", port)
|
||||
listener, err := net.Listen("tcp", address)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
defer listener.Close()
|
||||
return true
|
||||
}
|
||||
|
||||
// 如果id是0,那就是login server
|
||||
func Start(serverid uint16) {
|
||||
// 确定端口
|
||||
port, err := determinePort()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to determine port: %v", err)
|
||||
}
|
||||
ser := socket.NewServer(
|
||||
socket.WithCORS(),
|
||||
socket.WithPort(port),
|
||||
)
|
||||
// go func() {
|
||||
t := rpc.StartClient(serverid, uint16(port), ser)
|
||||
|
||||
controller.Maincontroller.RPCClient = *t //将RPC赋值Start
|
||||
controller.Maincontroller.Port = uint16(port) //赋值服务器ID
|
||||
controller.Init(true)
|
||||
xmlres.Initfile()
|
||||
blservice.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port))
|
||||
ser.Boot()
|
||||
}
|
||||
package main
|
||||
|
||||
import (
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/common/rpc"
|
||||
"blazing/common/socket"
|
||||
|
||||
"blazing/cool"
|
||||
"blazing/logic/controller"
|
||||
|
||||
blservice "blazing/modules/blazing/service"
|
||||
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
const (
|
||||
minRandomPort = 10000
|
||||
maxRandomPort = 60000
|
||||
maxPortRetryCount = 5
|
||||
)
|
||||
|
||||
var candidatePorts = cool.Config.GamePort
|
||||
|
||||
// determinePort 确定服务器使用的端口
|
||||
func determinePort() (int, error) {
|
||||
|
||||
// 尝试从指定端口列表中找可用端口,最多尝试maxPortRetryCount轮
|
||||
for i := 0; i < maxPortRetryCount; i++ {
|
||||
// 遍历指定的端口列表
|
||||
for _, port := range candidatePorts {
|
||||
if isPortAvailable(port) {
|
||||
return int(port), nil
|
||||
}
|
||||
log.Printf("Port %d is not available, checking next...", port)
|
||||
}
|
||||
log.Printf("All candidate ports are in use, retrying round %d...", i+1)
|
||||
}
|
||||
|
||||
return 0, fmt.Errorf("failed to find available port after %d rounds of checking", maxPortRetryCount)
|
||||
}
|
||||
|
||||
// isPortAvailable 检查端口是否可用
|
||||
func isPortAvailable(port uint64) bool {
|
||||
address := fmt.Sprintf(":%d", port)
|
||||
listener, err := net.Listen("tcp", address)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
defer listener.Close()
|
||||
return true
|
||||
}
|
||||
|
||||
// 如果id是0,那就是login server
|
||||
func Start(serverid uint16) {
|
||||
// 确定端口
|
||||
port, err := determinePort()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to determine port: %v", err)
|
||||
}
|
||||
ser := socket.NewServer(
|
||||
socket.WithCORS(),
|
||||
socket.WithPort(port),
|
||||
)
|
||||
// go func() {
|
||||
t := rpc.StartClient(serverid, uint16(port), ser)
|
||||
|
||||
controller.Maincontroller.RPCClient = *t //将RPC赋值Start
|
||||
controller.Maincontroller.Port = uint16(port) //赋值服务器ID
|
||||
controller.Init(true)
|
||||
xmlres.Initfile()
|
||||
blservice.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port))
|
||||
ser.Boot()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user