|
|
14 giờ trước cách đây | |
|---|---|---|
| .cursor | 1 tuần trước cách đây | |
| apollo_60000 | 1 tuần trước cách đây | |
| data | 5 ngày trước cách đây | |
| local_static_test | 1 tuần trước cách đây | |
| scripts | 1 tuần trước cách đây | |
| server | 14 giờ trước cách đây | |
| server_battle | 1 tuần trước cách đây | |
| start | 1 tuần trước cách đây | |
| .gitignore | 1 tuần trước cách đây | |
| README.md | 15 giờ trước cách đây | |
| readold.txt | 2 tuần trước cách đây | |
| 船长教程.txt | 1 tháng trước cách đây | |
| 静态服务停止.bat | 1 tuần trước cách đây | |
| 静态服务启动.bat | 1 tuần trước cách đây |
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)服务端运行时读取的是 lua 文件(templates_lua/),而不是 xlsx 源文件。
以下命令均在服务器上直接执行。lua 文件需提前通过其他方式(scp / rsync / git pull 等)上传到服务器。
第一步:将 lua 文件放到正确目录
目标路径:/data/CzServer/data/ServerData/templates_lua/<表名.xlsx>/
例如只更新常量表:
/data/CzServer/data/ServerData/templates_lua/gameConfig.xlsx/gameConfig.lua
第二步:执行热更指令
全量热更(更新了多张表时):
curl -s -X POST "http://127.0.0.1:18084/cmd/" -d "reloadalltable"
单表热更(只改了一张表,速度更快):
curl -s -X POST "http://127.0.0.1:18084/cmd/" -d "reloadtable C常量配置#gameConfig.xlsx"
单表参数规则:使用 templates_xls/ 下的原始 Excel 文件名(含中文前缀和 .xlsx),例如:
| 表 | 命令参数 |
|---|---|
C常量配置#gameConfig.xlsx |
reloadtable C常量配置#gameConfig.xlsx |
D道具表#item.xlsx |
reloadtable D道具表#item.xlsx |
CCDK#CDKConfig.xlsx |
reloadtable CCDK#CDKConfig.xlsx |
注意:参数不能省略前缀或
.xlsx后缀,否则 DataCenter 找不到对应 loader,热更会静默失败(日志只显示reload table cmd xxx,无 TemplateDataCenter 输出)。
第三步:验证
tail -f /data/CzServer/_output.server/logfile/gamenode1.log \
| grep -E "reload all table|Handle App Command|ERROR Table"
聊天系统依赖游密 IM 云服务收发消息。框架默认集成了一个第三方 AppKey,正式上线前必须替换为自己的账号,否则聊天频道会与原 AppKey 所属项目的玩家共享。
AppKey、AppSecret、管理员 identifier(注册邮箱)编辑所有环境的启动配置文件(_launch_server.xml、_launch_server_s101.xml 等),找到 <ChatService> 节点:
<ChatService>
<HttpListen>http://+:18089/chat/</HttpListen>
<AppKey>替换为你的 AppKey</AppKey>
<AppSecret>替换为你的 AppSecret</AppSecret>
</ChatService>
配置文件位置:
houduan/server/src/server/OpenCards.Server.DotNetCore/dev/_launch_server.xml
houduan/server/src/server/OpenCards.Server.Main/_launch_server_s101.xml
houduan/start/_launch_server.xml
identifier 是游密管理员 API 的身份凭证,现在硬编码为原开发商邮箱,需改为自己的游密注册邮箱。
文件:houduan/server/src/server/OpenCards.Service.Chat/ChatService.cs 第 158 行
// 改前
url += "&identifier=chenwen01@bianfeng.com";
// 改后(替换为你的游密注册邮箱)
url += "&identifier=your@email.com";
客户端(Unity)同样需要使用相同的 AppKey 初始化游密 SDK,具体参考游密官方文档。
服务端与客户端必须使用同一个
AppKey,否则消息无法互通。