本篇文章将聚焦服务端游戏逻辑实现,以 Node.js + Socket.io 作为主要通信与逻辑处理框架,展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析,并附上多个核心代码段。
一、服务端文件结构概览
/server/
├── index.js // 主入口文件
├── config.js // 配置文件(端口、数据库)
├── room_manager.js // 房间逻辑控制
├── player_manager.js // 玩家状态维护
├── game_modules/
│ ├── slot.js // 游戏逻辑模块
│ ├── fish.js // 捕鱼逻辑模块
│ └── common.js // 公共逻辑模块(广播等)
└── db/
└── mysql.js // MySQL 操作封装
二、用户登录认证流程
服务端监听客户端的 login
事件:
io.on('connection', socket => {
socket.on('login', async ({ uid, token }) => {
const user = await db.getUser(uid);
if (!user || user.token !== token) {
socket.emit('login_failed', { reason: '认证失败' });
} else {
playerManager.addPlayer(uid, socket);
socket.emit('login_success', { nickname: user.nickname });
}
});
});
三、房间分配与广播机制
使用一个简单的房间管理器将用户分配到房间中:
function assignRoom(uid) {
let room = findIdleRoom();
room.players.push(uid);
return room;
}
socket.on('join_room', ({ uid }) => {
const room = assignRoom(uid);
socket.join(`room_${room.id}`);
io.to(`room_${room.id}`).emit('room_update', room);
});
四、子游戏模块加载机制
游戏模块按子类型注册至模块管理器,在用户进入后调用:
const gameModules = {
'slot': require('./game_modules/slot'),
'fish': require('./game_modules/fish')
};
socket.on('start_game', ({ type, uid }) => {
const game = gameModules[type];
if (game) game.init(uid, socket);
});
五、MySQL 数据交互封装
// db/mysql.js
const mysql = require('mysql2');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '123456',
database: 'casino'
});
exports.getUser = (uid) => {
return new Promise((resolve, reject) => {
pool.query('SELECT * FROM users WHERE uid=?', [uid], (err, results) => {
if (err) return reject(err);
resolve(results[0]);
});
});
};
六、异常处理与日志策略
-
所有请求加 try/catch 保护
-
使用 Winston 日志库记录关键行为:
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: 'logs/server.log' })
]
});
logger.info(用户 ${uid} 登录成功
);
七、小结
本文分析了三网通电玩城平台在 Node.js 服务端的通信认证机制、房间分配逻辑与游戏调度框架,配合完整代码示例,便于开发者快速理解并进行自定义二次开发。下一篇将进一步深入控制台与银商系统的搭建与权限管理。