Skip to content

房间机制(概览)

xymj-colyseus-server 里,Colyseus 房间(Room) 是实时对战、匹配大厅、聊天频道等业务的核心载体:客户端通过 WebSocket 与某个 房间名(roomName 下的服务端逻辑进程通信,而不是每个 HTTP 请求单独短连接。

房间在整体架构中的位置

维度HTTP APIColyseus 房间
连接方式请求 / 响应,用完即结束长连接,可长时间保持
典型用途登录注册、支付、配置拉取对局状态、匹配排队、频道聊天、帧同步输入
鉴权Authorization: Bearer进房时在 joinOrCreate / joinById 的 options 里带 JWT(约定见 JWT 与房间鉴权

常见流程:REST 登录拿到 token → 客户端再连 Colyseus 并进房。同一用户可同时存在于多个房间(例如一边在 matchmaker_room 排队,另一边已进入 chat_team_room),只要你方客户端发起多次 join。

本仓库注册的房间类型(客户端 roomName

src/app.config.ts 中注册一致(详见 项目结构):

房间名服务端类(示意)典型用途备注
my_roomMyRoom示例 / 模板熟悉 Schema、消息注册
matchmaker_roomMatchmakerRoom主动匹配、Party 房间码依赖 Redis(队列、跨进程通知)
game_roomGameRoomExample(示例实现)帧同步对局多由匹配下发 joinById;含 input、重连;正式项目宜 fork 自有房间类
chat_world_roomWorldChatRoom世界 / 工会 / 附近 / 队伍聊天世界频道常配合 Redis 跨实例同步
loadtest_roomLoadTestRoom压连接 / 吞吐无 JWT,仅测试;生产建议关闭

同一玩法不要混用房间名:例如「路人匹配」与「好友房」共用协议层消息(如 match:find)但仍在 matchmaker_room 内完成;真正对战在进入 game_room 后才开始。

两种同步手段:Schema 状态 vs 自定义消息

  • Schema 状态(@colyseus/schema:房间内有 Room.state,服务端修改字段后 Colyseus 自动增量同步给所有订阅客户端,适合「盘面数据」「血量字典」等结构化状态。详见 状态同步(Schema)
  • room.send / onMessage:适合一次性事件、指令响应、聊天文本等;不必进入 Schema。约定集中写在 消息协议,专题见 多模式聊天匹配与开房

很多房间 两者并用:例如 game_room 用 Schema 保存帧相关状态,用消息下发 frameSyncplayerOffline 等事件。

何时拆成多个房间

  • 按玩法隔离:匹配 / 大厅(matchmaker_room)与单局对战(game_room)分离,避免大厅广播冲击对局逻辑。
  • 按频道隔离:世界 / 工会 / 附近 / 队伍使用不同 chat_*_room,进房 options(guildIdteamId、坐标)决定谁能收到聊天。
  • 按人数与生命周期:一局结束可销毁 game_room 实例;聊天房可按业务常驻或短 TTL。

环境与依赖(与房间相关)

  • Redis:匹配队列、部分聊天跨进程、match:found 投递、会话与重连键等多处使用;本地跑 Matchmaking / 多实例 前请先启动 Redis(见 配置说明)。
  • MySQL / TypeORM:偏 HTTP 与持久化业务;房间内存状态仍以 Colyseus 房间与 Redis 为主。

推荐阅读顺序

  1. 生命周期 — 回调顺序、客户端与服务端视角
  2. 鉴权与权限(细则:JWT 与房间鉴权
  3. 状态同步(Schema)
  4. 多模式聊天
  5. 匹配与开房matchmaker_room + Redis / 房间码)
  6. 帧同步与游戏房game_roominput、重连)

更多按玩法选型可先看 应用场景概览