船长服务器

pigflower bfe992e1c8 init пре 5 дана
apollo_60000 d3c6af2760 init пре 5 дана
data d3c6af2760 init пре 5 дана
server bfe992e1c8 init пре 5 дана
server_battle d3c6af2760 init пре 5 дана
.gitignore d3c6af2760 init пре 5 дана
README.md d3c6af2760 init пре 5 дана
readme.txt d3c6af2760 init пре 5 дана
船长教程.txt d3c6af2760 init пре 5 дана

README.md

简炉远镇 游戏服务端

项目结构

jianyuyuanzhen/
├── houduan/
│   ├── cccz/
│   │   ├── server/                        # 主服务端
│   │   │   ├── Workspace.sln              # VS2019 解决方案入口
│   │   │   ├── src/
│   │   │   │   ├── core/                  # 核心库(OpenCards.Core 等)
│   │   │   │   ├── server/                # 业务服务端源码(29 个工程)
│   │   │   │   ├── library/               # 预编译框架依赖(DeepCore / DeepFrozen)
│   │   │   │   ├── data/
│   │   │   │   │   ├── ServerData/        # 游戏配置/模板数据
│   │   │   │   │   └── ClientScript/      # Lua 业务逻辑脚本(4361 个文件)
│   │   │   │   ├── _output.server/        # 编译产物输出目录
│   │   │   │   │   └── dev/               # 启动配置与脚本
│   │   │   │   ├── afk.sql                # 主库建库脚本(orm / dbpay)
│   │   │   │   └── afk_gm.sql             # GM 后台库脚本(afk_gm)
│   │   │   └── DeepMMO/                   # 底层框架源码
│   │   └── data/ClientScript/             # 协议文件
│   └── phpstudy_pro/WWW/apollo_60000/     # Nginx 静态文件(服务器列表等)
└── server_battle/                         # 战斗服(独立工程,.NET Framework 4.6)
    ├── server_battle.sln
    ├── GameLogic/
    ├── ServerLib/
    └── _output.battle.server/

节点架构

启动顺序 节点 说明 端口
1 NameServer 根节点,节点注册中心 RPC 17000
2 PublicNode 公会 / 支付 / 聊天 / GM 后台 RPC 17060,HTTP 18082 / 18088 / 18089
3 GameNode1 游戏逻辑,客户端 TCP 连接入口 RPC 17020,TCP 19821
4 AccountNode1 账号 / 登录服务 RPC 17010,HTTP 18081
独立 BattleServer 战斗结算(独立进程) HTTP 8088

Mac 本地开发环境

依赖安装

# .NET 5.0 SDK
brew install --cask dotnet-sdk

# 验证版本(需要 5.x)
dotnet --version

# MySQL、Redis、Nginx
brew install mysql@5.7 redis nginx

# libuv(服务端网络层依赖)
brew install libuv

# 启动服务并设置开机自启
brew services start mysql@5.7
brew services start redis
brew services start nginx

初始化数据库

# 设置 MySQL root 密码为 123456(与配置文件一致)
mysql_secure_installation

mysql -u root -p < houduan/cccz/server/src/afk.sql
mysql -u root -p < houduan/cccz/server/src/afk_gm.sql

配置 Nginx(服务器列表)

编辑 Nginx 配置(/opt/homebrew/etc/nginx/nginx.conf 或新增 conf.d 文件):

server {
    listen 80;
    server_name localhost;
    root /path/to/jianyuyuanzhen/houduan/phpstudy_pro/WWW;
    location /apollo_60000/ {
        add_header Content-Type application/json;
        try_files $uri =404;
    }
}
nginx -t && brew services restart nginx
# 验证:curl http://localhost/apollo_60000/serverlist.json

编译主服务端

Mac 下使用 dotnet build 命令行编译,无需 Visual Studio。

cd houduan/cccz/server/src/server/OpenCards.Server.DotNetCore

dotnet build OpenCards.Server.DotNetCore.csproj -c Debug

注意:编译完成后 PostBuild 阶段会调用 copydll.bat,在 Mac 上会报错,这是正常的—— 实际 DLL 已通过 <OutputPath> 配置直接输出到 _output.server/,忽略该报错即可。

配置启动参数

编辑 houduan/cccz/server/src/_output.server/dev/_launch_server.xml, 将 ServerListUrlclient_storage_url 等地址改为本机 Nginx 地址:

<ServerListUrl>http://127.0.0.1/apollo_60000/serverlist.json</ServerListUrl>
<client_storage_url>http://127.0.0.1/apollo_60000/</client_storage_url>
<StopServerDataURL>http://127.0.0.1/apollo_60000/stop_server_list.json</StopServerDataURL>
<UpdateServerConfig>http://127.0.0.1/apollo_60000/update_server_config.json</UpdateServerConfig>

MySQL 密码确认与配置文件一致(默认 123456):

<Mysql>server=127.0.0.1;User ID=root;Password=123456;database=orm</Mysql>

启动主服务端

开 4 个终端窗口,按顺序执行

# 公共变量
export DEV=houduan/cccz/server/src/_output.server/dev
export DLL=houduan/cccz/server/src/_output.server/OpenCards.Server.DotNetCore.dll

# 终端 1 — NameServer(先启动)
cd $DEV && dotnet ../$DLL ./_launch_server.xml NameServer

# 终端 2 — PublicNode
cd $DEV && dotnet ../$DLL ./_launch_server.xml PublicNode

# 终端 3 — GameNode
cd $DEV && dotnet ../$DLL ./_launch_server.xml GameNode1 global.RealmID=1 global.ServerID=1

# 终端 4 — AccountNode(最后启动)
cd $DEV && dotnet ../$DLL ./_launch_server.xml AccountNode1

启动战斗服(Mac 需要 Mono)

战斗服基于 .NET Framework 4.6,Mac 下用 Mono 运行:

brew install mono

# 修改 Config.json,luaRoot 改为本机路径
cat > server_battle/_output.battle.server/Config.json << 'EOF'
{
    "ip": "127.0.0.1",
    "port": 8088,
    "luaRoot": "/absolute/path/to/houduan/cccz/server/src/data/ClientScript/"
}
EOF

cd server_battle/_output.battle.server
mono GameLogic.exe

Linux 部署

1. 安装系统依赖

# Ubuntu / Debian
apt update
apt install -y mysql-server redis-server nginx libuv1 mono-complete

# CentOS / RHEL
yum install -y mysql-server redis nginx libuv mono-complete

2. 安装 .NET 5.0

wget https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz

mkdir -p $HOME/dotnet
tar zxf dotnet-sdk-5.0.100-linux-x64.tar.gz -C $HOME/dotnet

echo 'export DOTNET_ROOT=$HOME/dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$HOME/dotnet' >> ~/.bashrc
source ~/.bashrc

dotnet --version   # 确认输出 5.0.x

3. 初始化数据库

mysql -u root -p < houduan/cccz/server/src/afk.sql
mysql -u root -p < houduan/cccz/server/src/afk_gm.sql

4. 上传服务端文件

在本机(Windows/Mac)完成编译后上传到服务器:

# 编译产物
scp -r houduan/cccz/server/src/_output.server/ user@server:/opt/gameserver/_output.server/

# Lua 脚本和游戏数据
scp -r houduan/cccz/server/src/data/ user@server:/opt/gameserver/data/

目标服务器目录结构:

/opt/gameserver/
├── _output.server/
│   ├── OpenCards.Server.DotNetCore.dll
│   ├── dev/
│   │   └── _launch_server.xml
│   └── logfile/
└── data/
    ├── ServerData/
    └── ClientScript/

5. 修改启动配置

编辑 /opt/gameserver/_output.server/dev/_launch_server.xml

<!-- 服务器列表地址改为服务器公网 IP -->
<ServerListUrl>http://<公网IP>/apollo_60000/serverlist.json</ServerListUrl>
<client_storage_url>http://<公网IP>/apollo_60000/</client_storage_url>
<StopServerDataURL>http://<公网IP>/apollo_60000/stop_server_list.json</StopServerDataURL>
<UpdateServerConfig>http://<公网IP>/apollo_60000/update_server_config.json</UpdateServerConfig>

<!-- MySQL 密码 -->
<Mysql>server=127.0.0.1;User ID=root;Password=YOUR_PASSWORD;database=orm</Mysql>

TemplateRoot 使用相对路径 ../../data/ServerData/, 确保 _output.server/dev/data/ 在同一父目录下即可,无需修改。

6. 配置 Nginx

mkdir -p /var/www/html/apollo_60000
cp houduan/phpstudy_pro/WWW/apollo_60000/* /var/www/html/apollo_60000/

cat > /etc/nginx/conf.d/gameserver.conf << 'EOF'
server {
    listen 80;
    server_name _;
    root /var/www/html;
    location /apollo_60000/ {
        add_header Content-Type application/json;
        try_files $uri =404;
    }
}
EOF

nginx -t && systemctl reload nginx

7. 启动主服务端

BASE=/opt/gameserver/_output.server
DLL=$BASE/OpenCards.Server.DotNetCore.dll
CFG=$BASE/dev/_launch_server.xml

# 按顺序后台启动(建议使用 screen 或 systemd 管理)
cd $BASE/dev

nohup dotnet $DLL $CFG NameServer  > $BASE/logfile/nameserver.log 2>&1 &
sleep 3

nohup dotnet $DLL $CFG PublicNode  > $BASE/logfile/publicnode.log 2>&1 &
sleep 3

nohup dotnet $DLL $CFG GameNode1 global.RealmID=1 global.ServerID=1 > $BASE/logfile/gamenode1.log 2>&1 &
sleep 3

nohup dotnet $DLL $CFG AccountNode1 > $BASE/logfile/accountnode.log 2>&1 &

各节点日志也会自动写入 _output.server/logfile/ 目录(log4net 配置)。

8. 启动战斗服

# 修改 luaRoot 为 Linux 路径
cat > server_battle/_output.battle.server/Config.json << 'EOF'
{
    "ip": "0.0.0.0",
    "port": 8088,
    "luaRoot": "/opt/gameserver/data/ClientScript/"
}
EOF

cd server_battle/_output.battle.server
nohup mono GameLogic.exe > /var/log/battleserver.log 2>&1 &

9. 用 systemd 管理进程(推荐)

以 NameServer 为例,创建 /etc/systemd/system/gameserver-name.service

[Unit]
Description=Game NameServer
After=network.target

[Service]
WorkingDirectory=/opt/gameserver/_output.server/dev
ExecStart=/root/dotnet/dotnet /opt/gameserver/_output.server/OpenCards.Server.DotNetCore.dll ./_launch_server.xml NameServer
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable gameserver-name
systemctl start gameserver-name

其余节点(PublicNode / GameNode1 / AccountNode1)按同样方式创建对应 service 文件。


端口规划

服务 端口 协议
NameServer 17000 RPC
AccountNode RPC 17010 RPC
GameNode1 RPC 17020 RPC
PublicNode RPC 17060 RPC
AccountServer(登录) 18081 HTTP
PayServer(支付) 18082 HTTP
AdminService(GM 接口) 18088 HTTP
ChatService 18089 HTTP
ConnectorService(客户端) 19821 TCP
BattleServer(战斗结算) 8088 HTTP
Nginx(服务器列表) 80 HTTP
MySQL 3306 TCP
Redis 6379 TCP

前端调试连接速查

前端/客户端只需关心以下几个对外暴露的地址,其余 RPC 端口是服务端内部通信,不需要配置。

本机调试(服务端跑在本地)

用途 地址 备注
服务器列表 http://43.226.57.217/apollo_60000/serverlist.json Nginx 静态文件,客户端启动时拉取
登录 / 账号接口 http://43.226.57.217:18081 AccountNode HTTP,登录、注册等接口
游戏逻辑连接 43.226.57.217:19821 TCP 长连接,游戏主逻辑入口
战斗结算 http://43.226.57.217:8088 BattleServer HTTP,战斗结果上报
GM 后台 http://43.226.57.217:18088 AdminService,仅调试用

连接远程服务器

将上表中的 127.0.0.1 替换为服务器公网 IP 即可。例如服务器 IP 为 1.2.3.4

服务器列表:http://1.2.3.4/apollo_60000/serverlist.json
登录接口:  http://1.2.3.4:18081
游戏连接:  1.2.3.4:19821  (TCP)
战斗服:    http://1.2.3.4:8088

防火墙注意:远程服务器需要开放 8018081198218088 端口,其余端口(17000~17060)是内网 RPC,不需要对外暴露。

注意事项

  • 4 个主节点必须按顺序启动,NameServer 最先、AccountNode 最后,否则节点注册会失败
  • TemplateRoot 使用相对路径,工作目录必须在 _output.server/dev/ 下执行 dotnet 命令
  • 战斗服 Config.json 中的 luaRoot 不同系统路径格式不同:Windows 用 \\,Mac/Linux 用 /
  • serverlist.json 中的 address 字段需与 ConnectorService 实际监听的 IP:Port(默认 19821)一致
  • update_server_config.json 中的 loginServerUrl 需指向 AccountNode 的 HTTP 地址(默认端口 18081)