# WebSocket 服务器

DDTV5 内置了一个 WebSocket 推送通道,用于把运行过程中的状态变化(开播、开始录制、录制结束、登录态变化、配置修改等)实时推送给所有已连接的客户端。WEBUI 的实时状态刷新就是基于它实现的。

# 这是什么

  • WebSocket 服务跟随 WEB 服务一起启动,没有独立的开关和端口,挂在主 HTTP 服务的 /ws 路径上。
  • 只要 EnableWebServertrue(默认)且 Port 不为 0,WebSocket 推送就可用。
  • 连接无鉴权,不需要计算 sig
  • 这是一个单向推送通道:服务端会主动广播事件消息;客户端发给服务端的消息只会被原样回显(echo),不会被处理。需要执行操作请使用 HTTP API

# 怎么连接

ws://<IP>:<端口>/ws

默认即 ws://127.0.0.1:11419/ws。用浏览器开发者工具就可以快速验证:

const ws = new WebSocket("ws://127.0.0.1:11419/ws");
ws.onmessage = (e) => console.log(JSON.parse(e.data));

连接成功后,每当 DDTV 发生状态变化(例如某个房间开播、开始录制),你就会收到一条 JSON 消息。

# 推送消息长什么样

每条推送消息都是统一的 JSON 结构:

{
    "cmd": "StartRecording",
    "code": 40104,
    "data": { "Name": "某某主播", "UID": 672346917, "...": "..." },
    "message": "开始录制"
}
  • cmd / code:事件名称和事件代码(如 40104 = 开始录制、40105 = 录制结束、40102 = 开播事件、30106 = 登录态失效)
  • data:关联的房间信息对象(与具体房间无关的事件为 null
  • message:事件描述文本

完整的事件代码表、data 字段结构、消息合并机制说明以及 JavaScript / Python 客户端示例,见 WebSocket 推送协议文档

# 使用建议

注意

  • 服务端会把同一批中相同事件 + 相同房间的重复消息合并为最新一条再广播,因此该通道不适合当作完整事件日志;需要可靠事件流的场景请自行在接收端结合 HTTP API 查询兜底。
  • 消息不能丢的场景也可以改用 WebHook:同一份推送内容会以 HTTP POST 发到你配置的地址,无需维持长连接。
  • WebSocket 通道没有鉴权,请勿把 DDTV 的端口直接暴露到公网;如需远程访问请自行加反向代理和访问控制。