diff --git a/3DTank/tools/wss_server.js b/3DTank/tools/wss_server.js index d73728b..c6c3234 100644 --- a/3DTank/tools/wss_server.js +++ b/3DTank/tools/wss_server.js @@ -555,9 +555,10 @@ WsServer.on('connection', (Client, Req) => { : undefined; // 转发:客户端帧**原样直发**;上游未就绪时暂存,open 后按原序补发(不重放、不改字节)。 - // ★ 上游不再"连上就建":等客户端首帧到达、解出命令 ID 后再选上游(见下方 Client.on('message'))。 + // 注:曾试过"等首帧再选上游",但已证伪(本机镜像的 config-template 没有 {server},官方分服是靠 /s/status.js), + // 故恢复为"连上立即建上游",保持与上游 TLS 建连的并行(不增加握手延迟)。 const StartUpstream = (Target) => { - State.Log('上游选择: ' + Target + (Target === UPSTREAM ? '(主:大厅连接)' : '(备:复用哈希的二次进空间)')); + State.Log('上游选择: ' + Target); const U = new Ws(Target, { headers: UpHeaders, protocols: UpProtocols, rejectUnauthorized: false }); U.binaryType = 'nodebuffer'; U.on('open', () => { @@ -578,25 +579,14 @@ WsServer.on('connection', (Client, Req) => { U.on('error', (Err) => State.Log('上游错误: ' + Err.message)); Upstream = U; }; + StartUpstream(UPSTREAM); Client.on('message', (Data) => { const Buf = Buffer.from(Data); SaveFrame(State, 'c2s', Buf); Decoders.c2s.Feed(Buf); SyncKeys(Decoders); - if (!Upstream) { - // 上游还没定:先暂存,并尝试用首帧的命令 ID 决定去主上游还是备用上游 - Pending.push(Buf); - const Id = Decoders.c2s.FirstCmdId; - if (Id === null) { - State.Log('等待首帧命令 ID 以决定上游(暂存 ' + Buf.length + ' 字节)'); - return; - } - // 1 = Hash Request(大厅)→ 主上游;3 = Auth/EnterSpace(复用会话哈希的二次进空间)→ 备用上游 - StartUpstream(Id === 3 ? UPSTREAM_ALT : UPSTREAM); - return; - } - if (Upstream.readyState === Ws.OPEN) Upstream.send(Buf); + if (Upstream && Upstream.readyState === Ws.OPEN) Upstream.send(Buf); else { State.Log('上游尚未就绪,暂存 ' + Buf.length + ' 字节待补发'); Pending.push(Buf);