Files
bl/logic/server.go
昔念 5e277defb7 feat(map): 实现地图加载和玩家进入地图功能
- 在 Player 结构中添加 MapId 字段,用于记录当前所在地图 ID
- 新增地图配置解析功能,支持从 XML 文件中读取地图信息
- 实现玩家进入地图的逻辑,包括设置玩家位置和广播通知
- 更新登录逻辑,在玩家登录时自动进入默认地图
- 重构地图相关的数据结构和接口,为后续地图功能扩展做准备
2025-08-15 22:44:28 +08:00

101 lines
2.3 KiB
Go

package main
import (
"blazing/common/rpc"
"blazing/common/socket"
"blazing/common/socket/handler"
"blazing/cool"
"blazing/logic/controller"
"blazing/modules/blazing/service"
"fmt"
"log"
"math/rand"
"net"
"time"
"github.com/gogf/gf/v2/util/gconv"
)
const (
minRandomPort = 10000
maxRandomPort = 60000
maxPortRetryCount = 5
)
var defaultPort = gconv.Int(cool.Config.Port) //读入默认的端口
// determinePort 确定服务器使用的端口
func determinePort(serverid uint16) (int, error) {
rand.Seed(time.Now().UnixNano())
if serverid == 0 {
return defaultPort, nil
}
for i := 0; i < maxPortRetryCount; i++ {
port := generateRandomPort()
if isPortAvailable(port) {
return port, nil
}
log.Printf("Port %d is not available, retrying...", port)
}
return 0, fmt.Errorf("failed to find available port after %d attempts", maxPortRetryCount)
}
// generateRandomPort 生成指定范围内的随机端口
func generateRandomPort() int {
return minRandomPort + rand.Intn(maxRandomPort-minRandomPort)
}
// isPortAvailable 检查端口是否可用
func isPortAvailable(port int) 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) {
//ants.NewPool(100)
head := handler.NewTomeeHandler()
head.Callback = controller.Recv
if serverid != 0 { //logic服务器
// 确定端口
port, err := determinePort(serverid)
if err != nil {
log.Fatalf("Failed to determine port: %v", err)
}
// go func() {
t := rpc.StartClient(serverid, uint16(port), new(controller.LogicClient))
controller.Maincontroller.RPCClient = *t //将RPC赋值Start
controller.Maincontroller.Port = uint16(port) //赋值服务器ID
service.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port), t)
socket.
NewServer(
socket.WithCORS(),
socket.WithPort(port),
socket.WithSocketHandler(head)).
Boot()
} else {
go rpc.StartServer()
//go rpcserver() //对login tcp启动
//ants.Submit(rpcserver)
socket.NewServer(
socket.WithCORS(),
socket.WithPort(defaultPort),
socket.WithSocketHandler(head)).Boot()
}
}