Skip to content

WebRTC - RTCDataChannel API

WebRTC 不仅擅长流式传输音频和视频,也擅长在对等端之间传输任意数据。RTCDataChannel 对象是实现此能力的关键,它支持低延迟的点对点数据交换。

RTCDataChannel 可以配置为可靠(如 TCP)或不可靠(如 UDP),以及有序或无序。这种灵活性使其适用于广泛的应用,从文件共享、游戏到文本聊天和实时传感器数据。

  • label (只读字符串): 返回通道创建时为其分配的名称。对于区分多个数据通道非常有用。
  • ordered (只读布尔值): 如果通道保证消息顺序,返回 true,否则返回 false。在创建时设置。
  • protocol (只读字符串): 返回正在使用的子协议名称(如果有的话)。这是一个应用程序定义的字符串。
  • id (只读无符号短整型?): 返回通道的唯一数字 ID,由浏览器分配。如果通道尚未协商或与底层 SCTP 流关联,则可能为 null。
  • readyState (只读字符串): 返回表示通道当前状态的枚举 (RTCDataChannelState)。可能的值包括:
  • * `"connecting"`: 通道尚未打开,但正在连接过程中。这是新创建通道的初始状态。
  • * `"open"`: 通道已打开并准备发送和接收消息。
  • * `"closing"`: 通道正在关闭过程中。
  • * `"closed"`: 通道已关闭或无法建立。
  • bufferedAmount (只读无符号长整型): 返回当前排队等待发送但尚未传输的数据字节数。此值随着数据通过网络发送而减少。
  • bufferedAmountLowThreshold (无符号长整型): 一个可配置的阈值。当 bufferedAmount 低于此值时,会触发 bufferedamountlow 事件。这可用于流量控制。
  • binaryType (字符串): 指定用于表示在通道上接收到的二进制数据的 JavaScript 对象类型。可设置为 "blob" 或 "arraybuffer"。如果未指定接收数据的类型,默认为 "blob",但发送时,send() 接受 String、Blob、ArrayBuffer 或 ArrayBufferView。
  • maxPacketLifeTime (只读无符号短整型?): 对于不可靠通道,指示通道在放弃之前尝试传输或重传消息的最大时间(毫秒)。与 maxRetransmits 互斥。
  • maxRetransmits (只读无符号短整型?): 对于不可靠通道,指示通道在消息未收到确认时尝试重传消息的最大次数。与 maxPacketLifeTime 互斥。
  • negotiated (只读布尔值): 如果通道是应用程序带外协商的(例如,通过信令预先约定特定的 ID),返回 true,否则(如果是由 WebRTC 本身带内协商的)返回 false。默认为 false。
  • reliable (只读布尔值): 此属性已弃用。请使用 ordered 和 (maxPacketLifeTime 或 maxRetransmits) 来确定可靠性特性。历史上,它指示通道是否配置为可靠传输。

注意:某些属性(如 maxPacketLifeTime 和 maxRetransmits)在使用 RTCPeerConnection.createDataChannel(label, options) 创建数据通道时配置。

  • onopen: 在触发 open 事件时调用的事件处理程序。这表明数据通道已成功建立并准备好进行通信。
  • onmessage: 在触发 message 事件时调用的事件处理程序。当从远端对等端接收到消息时发生。事件对象包含一个 data 属性,其中包含接收到的消息(String、Blob 或 ArrayBuffer,取决于 binaryType 和发送的内容)。
  • onbufferedamountlow: 在触发 bufferedamountlow 事件时调用的事件处理程序。当 bufferedAmount 低于 bufferedAmountLowThreshold 时发生。
  • onclosing: 在触发 closing 事件时调用的事件处理程序。这表明通道正在关闭过程中。它在 onclose 事件之前触发。
  • onclose: 在触发 close 事件时调用的事件处理程序。这表明数据通道已关闭。
  • onerror: 在触发 error 事件时调用的事件处理程序。当数据通道上遇到错误时发生。事件对象可能包含详细信息。
  • close(): 启动数据通道的关闭。这将最终导致 readyState 变为 "closing",然后是 "closed"。
  • send(data): 通过通道向远端对等端发送数据。data 参数可以是 DOMString、Blob、ArrayBuffer 或 ArrayBufferView。浏览器将处理适当的序列化用于传输。

理解这些 API 对于构建利用 WebRTC 数据传输能力的应用程序至关重要。后续章节将通过实际示例演示如何使用 RTCDataChannel,例如文本聊天应用程序。

有关更多详细信息,请始终参考最新的 W3C WebRTC 规范和 MDN Web Docs 中关于 RTCDataChannel 的文档。