Files
bl/logic/server.go

78 lines
1.9 KiB
Go
Raw Normal View History

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()
}