网络、登录与协议 private

网络、登录与协议

回答“客户端为什么有多种 Session、登录如何切到 Lobby、协议怎样保持兼容”。

返回技术文档目录

4. 客户端网络与登录

4.1 多 Session 模型

  1. 连接 Login,取得战区列表并认证。
  2. Login/PlayerMgr 分配 Lobby,客户端建立 Lobby 会话。
  3. 创建战斗后取得 Battle 地址和 BattleId,再建立 Battle 会话。

所以“能连接 7000”只证明 Login 可达,不代表 Lobby 和 Battle 已注册、已分配或可达。

4.2 本地登录地址

Unity Editor 下,ServerManager.IP 读取 Assets/Resources_moved/ServerCfg.asset,真正使用的是 ServerCfg.Value.ServerInfoList[CurServer].Ip。非 Editor 构建读取远端登录开关中的 ConnectIP,两条地址来源不要混淆。

战区列表只有业务信息,没有独立网络地址。客户端收到列表后把当前 Login IP 填给战区展示项;真正的 Lobby 地址在认证成功后的 Session 信息中返回。

4.3 登录时序

sequenceDiagram
    participant C as Unity Client
    participant L as Login :7000
    participant R as Redis
    participant P as PlayerMgr
    participant N as Lobby 节点池
    participant B as Lobby
    C->>L: 请求战区列表
    L->>R: 读取 battlefield_datas 等
    R-->>L: 战区与服数据
    L-->>C: AllBattleServerRst
    C->>L: 登录 + battlefieldId/serverId
    L->>R: 校验战区、令牌和状态
    L->>P: CreatePlayerSession
    P->>N: GetFreeNode()
    N-->>P: 可用 Lobby SessionId
    P-->>L: playerId + lobbySessionId
    L-->>C: 登录成功/会话信息
    C->>B: 连接 SessionId.PublicAddr:Port
    B-->>C: 玩家数据与大厅协议

本地“登录后连接测试服失败”的高频原因:

  • Redis 的 battlefield_datas、battlefield_server_datas:{id}、default_battlefield_server 未初始化。
  • PlayerMgr 没发现 Lobby,GetFreeNode() 返回空。
  • Lobby 注册了客户端无法访问的容器/内网地址。
  • 只启动了 Login,没有 PlayerMgr/Lobby。
  • Editor 的 ServerCfg 仍指向测试环境。

10. 协议与状态同步

协议源位于服务端 Packet_tool/*.proto,生成 C# 分别进入服务端 Packets 和客户端 Assets/Code/Core/Packets。不要手改生成物。

兼容规则:

  • 已发布字段号不复用、不改语义。
  • 新字段使用新编号,删除字段保留编号并优先 reserved。
  • 客户端、Login/Lobby/Battle 和节点间调用方一起重新生成和编译。
  • Opcode/枚举同样属于协议,不能只同步消息类。

战斗协议包括场景握手、实体生命周期、状态/快照和客户端操作请求。排查时同时记录会话类型、opcode、playerId、battleId、sceneGuid 和时间戳;只知道“收到一个包”不足以确认它到达了正确 Session 和 Battle Actor。


上一篇:服务端节点与分布式协调 下一篇:地图编辑、导出与双端加载