← 井字棋 · 一个被完全解出的游戏 / 联机对战:无后端的 P2P 实现 待审核 6 / 6
online · WebRTC P2P

联机对战:无后端的 P2P 实现

playground 是纯静态站点、没有后端,联机却仍然可行:用 WebRTC 在两个浏览器之间直接建立一条 RTCDataChannel,落子就通过这条点对点通道传输。唯一的难点是「建连接前两端要先交换一段连接描述」(信令),本页把这一步换成手动复制粘贴一段编码——于是连信令服务器都不需要。下面先看三种联机架构的取舍。

1 · 三种联机架构

三者的「数据通道」其实只有两种:经服务器中转,或浏览器点对点 (WebRTC)。区别主要在信令怎么交换——本页把信令降级为手动,换来零后端。
方案 数据怎么走 要不要后端 取舍
WebSocket + 权威服务器 两端都连服务器,由它中转 / 托管对局状态 要 (持续运行) 最稳定、天然穿透 NAT、好做防作弊;但要自建并运维后端。绝大多数在线对战这么做。
WebRTC P2P + 信令服务器 浏览器直连传数据;服务器只用来交换信令 要一个轻量信令服务 (+ STUN/TURN) 延迟低、省服务器带宽;信令服务很小,但 NAT 受限时仍需 TURN 中继兜底。
WebRTC P2P + 手动信令 ← 本页 浏览器直连;信令那一步改成手动复制粘贴 零后端 真正无服务器,适合 demo / 小范围对局;代价是建连需手动交换一次,且无 TURN 时对称 NAT 可能连不上。

怎么连上(流程):主持方点「创建邀请码」生成一段 offer 编码 → 把它发给对方(任意渠道均可)→ 对方粘贴后生成 answer 编码发回来 → 主持方粘贴并完成连接。通道一开,落子就直接在两个浏览器间点对点传。本机自测:把本页开两个标签页,一个当主持、一个当加入,在两个标签间互相复制那两段码即可。

连接失败的常见原因:本页只配了公共 STUN(帮双方发现自己的公网地址),没有 TURN 中继。当两端处在对称型 NAT(部分公司 / 校园网)后面时,纯 STUN 打洞会失败——生产环境通常再加一台 TURN 服务器兜底(那就又回到「需要一点后端」了)。同一局域网或多数家庭网络下,手动信令的纯 STUN 方案可直接连通。