网络、登录与协议 private
网络、登录与协议
回答“客户端为什么有多种 Session、登录如何切到 Lobby、协议怎样保持兼容”。
4. 客户端网络与登录
4.1 多 Session 模型
- 连接 Login,取得战区列表并认证。
- Login/PlayerMgr 分配 Lobby,客户端建立 Lobby 会话。
- 创建战斗后取得 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。