|
|
6 dienas atpakaļ | |
|---|---|---|
| apollo_60000 | 6 dienas atpakaļ | |
| data | 6 dienas atpakaļ | |
| server | 6 dienas atpakaļ | |
| server_battle | 6 dienas atpakaļ | |
| .gitignore | 6 dienas atpakaļ | |
| README.md | 6 dienas atpakaļ | |
| readme.txt | 6 dienas atpakaļ | |
| 船长教程.txt | 6 dienas atpakaļ |
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 |
# .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 配置(/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,
将 ServerListUrl、client_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
战斗服基于 .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
# 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
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
mysql -u root -p < houduan/cccz/server/src/afk.sql
mysql -u root -p < houduan/cccz/server/src/afk_gm.sql
在本机(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/
编辑 /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/ 在同一父目录下即可,无需修改。
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
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 配置)。
# 修改 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 &
以 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
防火墙注意:远程服务器需要开放
80、18081、19821、8088端口,其余端口(17000~17060)是内网 RPC,不需要对外暴露。
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)