# 简炉远镇 游戏服务端 ## 项目结构 ``` 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 本地开发环境 ## 依赖安装 ```bash # .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 ``` ## 初始化数据库 ```bash # 设置 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 文件): ```nginx 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; } } ``` ```bash nginx -t && brew services restart nginx # 验证:curl http://localhost/apollo_60000/serverlist.json ``` ## 编译主服务端 Mac 下使用 `dotnet build` 命令行编译,无需 Visual Studio。 ```bash cd houduan/cccz/server/src/server/OpenCards.Server.DotNetCore dotnet build OpenCards.Server.DotNetCore.csproj -c Debug ``` > **注意**:编译完成后 PostBuild 阶段会调用 `copydll.bat`,在 Mac 上会报错,这是正常的—— > 实际 DLL 已通过 `` 配置直接输出到 `_output.server/`,忽略该报错即可。 ## 配置启动参数 编辑 `houduan/cccz/server/src/_output.server/dev/_launch_server.xml`, 将 `ServerListUrl`、`client_storage_url` 等地址改为本机 Nginx 地址: ```xml http://127.0.0.1/apollo_60000/serverlist.json http://127.0.0.1/apollo_60000/ http://127.0.0.1/apollo_60000/stop_server_list.json http://127.0.0.1/apollo_60000/update_server_config.json ``` MySQL 密码确认与配置文件一致(默认 `123456`): ```xml server=127.0.0.1;User ID=root;Password=123456;database=orm ``` ## 启动主服务端 **开 4 个终端窗口,按顺序执行**: ```bash # 公共变量 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 运行: ```bash 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. 安装系统依赖 ```bash # 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 ```bash 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. 初始化数据库 ```bash mysql -u root -p < houduan/cccz/server/src/afk.sql mysql -u root -p < houduan/cccz/server/src/afk_gm.sql ``` ## 4. 上传服务端文件 在本机(Windows/Mac)完成编译后上传到服务器: ```bash # 编译产物 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`: ```xml http://<公网IP>/apollo_60000/serverlist.json http://<公网IP>/apollo_60000/ http://<公网IP>/apollo_60000/stop_server_list.json http://<公网IP>/apollo_60000/update_server_config.json server=127.0.0.1;User ID=root;Password=YOUR_PASSWORD;database=orm ``` `TemplateRoot` 使用相对路径 `../../data/ServerData/`, 确保 `_output.server/dev/` 和 `data/` 在同一父目录下即可,无需修改。 ## 6. 配置 Nginx ```bash 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. 启动主服务端 ```bash 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. 启动战斗服 ```bash # 修改 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`: ```ini [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 ``` ```bash 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 ``` > **防火墙注意**:远程服务器需要开放 `80`、`18081`、`19821`、`8088` 端口,其余端口(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)