Skip to content

信令事件 ​

除了 HTTP 接口,前端还通过一条 WebSocket 长连接接收实时事件——谁进来了、谁在说话、有新消息了。

连接 ​

ws(s)://你的域名/ws

连接后要带上登录令牌做认证。具体参数看前端实现(app/web/src/socket/)。

连接建立时会收到 connection 事件。

事件表 ​

方向说明:C→S 是客户端发给服务端,S→C 是服务端推给客户端。

房间 ​

事件方向说明
room:createC→S建房间
room:createdS→C房间建好了
room:joinC→S加入房间
room:leaveC→S离开房间
room:leftS→C已离开
room:listC→S要房间列表
room:list:resultS→C列表结果
room:updatedS→C房间信息变了
room:kickC→S踢人
room:kickedS→C你被踢了
room:join:sfuC→S通知服务端要连 SFU
room:active-speakersS→C当前谁在说话(批量)

成员 ​

事件方向说明
member:joinedS→C有人进来了
member:leftS→C有人走了
member:updatedS→C成员信息变了
member:speakingS→C某人在说话
member:mic-stateS→C麦克风开关状态变了
member:mutedS→C被禁言
member:unmutedS→C解除禁言

消息 ​

事件方向说明
message:sendC→S发消息
message:editC→S编辑
message:deleteC→S删除
message:reactC→S加表情
message:unreactC→S移除表情
message:createdS→C新消息广播
message:updatedS→C消息被编辑
message:deletedS→C消息被删除
message:reactionS→C反应变了
message:ackS→C发送确认(带消息 ID)
message:errorS→C发送失败

私聊 ​

事件方向说明
private:sendC→S发私聊
private:newS→C收到私聊

状态 ​

事件方向说明
typing双向正在输入
user:mutedS→C你被禁言了
user:unmutedS→C你被解除禁言
sfu:provider-changedS→C语音服务切了,需要重连
disconnectS→C连接断开

一次进房间的完整流程 ​

前端                          后端                    LiveKit
 │                             │                        │
 ├─ POST /signal/token ───────►│                        │
 │◄──── 令牌 + 地址 ───────────┤                        │
 │                             │                        │
 ├─ ws 连接 ──────────────────►│                        │
 │                             │                        │
 ├─ room:join ────────────────►│                        │
 │                             ├─ 检查密码/人数/权限     │
 │                             │                        │
 │◄──── member:joined × N ─────┤                        │
 │◄──── room:active-speakers ──┤                        │
 │                             │                        │
 ├─ 用令牌连 LiveKit ──────────────────────────────────►│
 │◄───────────────────── 音频流 ───────────────────────┤
 │                             │                        │
 │◄──── member:speaking ───────┤◄─── active speaker ────┤

关键点:信令和媒体是两条独立的连接。信令管状态同步,媒体管音频传输。

为什么要两条连接 ​

  • 信令要可靠(不能丢),走 TCP
  • 媒体要低延迟(能容忍少量丢包),走 UDP

混在一起会互相拖累:音频卡顿不应该导致状态同步延迟。

断线重连 ​

前端会自动重连,重连后要重新走一遍 room:join,把状态补齐。

重连期间状态可能不一致,服务端在 room:join 的响应里会返回完整成员列表,前端以这个为准覆盖本地状态。

常见问题 ​

一直显示「已断开」 Nginx 的 /ws location 没配 Upgrade 头。见 Nginx 配置。

能连上但收不到事件 令牌过期了。WebSocket 连接建立后不会自动刷新令牌,需要重连。

消息发出去没反应 看有没有收到 message:ack。没有的话是发送失败,检查连接状态。收到 message:error 说明服务端拒绝了,看错误内容。

成员列表不更新member:joined / member:left 没收到。多半是连接断了但界面没感知到,刷新页面。

下一步 ​

基于 Apache 2.0 许可开源