RTCDataChannel: send() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

RTCDataChannel 接口的 send() 方法将数据通过数据通道发送到远程对等方。此操作可以在任何时候进行,除了在底层传输通道的初始创建过程中。在连接建立之前发送的数据会被尽可能地缓冲(如果不可能则会发生错误),同时在连接关闭或已关闭期间发送的数据也会被缓冲。

注意: 不同浏览器对您发送的消息大小限制不同。规范中定义了如何自动分片大消息,但并非所有浏览器都实现了这些规范,即使实现了也可能存在各种额外的限制。随着时间的推移,这种情况会变得更简单,但目前,如果您有疑问,请参阅 理解消息大小限制

语法

js
send(data)

参数

data

要在连接上传输的数据。它可以是字符串、BlobArrayBufferTypedArrayDataView 对象。

返回值

无(undefined)。

异常

InvalidStateError DOMException

当数据通道尚未完成建立自己的连接时(即,其 readyStateconnecting)会抛出此异常。数据通道必须建立自己的连接,因为它使用与媒体内容不同的传输通道。此错误会在不发送或缓冲 data 的情况下发生。

OperationError DOMException

当指定的数据需要被缓冲,但缓冲区中没有足够空间时会抛出此异常。

TypeError

如果指定的数据对于接收方而言过大,将抛出此异常。由于存在多种将大数据拆分成小块进行传输的技术,因此可能会遇到接收方不支持相同分片技术的情况。例如,如果一方是支持使用 EOR(记录结束)标志来指示已接收消息是否为使用 send() 发送的多部分对象的最后一部分的现代浏览器。有关消息大小限制的更多信息,请参阅 理解消息大小限制

示例

在此示例中,创建了一个名为 sendMessage() 的例程;它接受一个对象作为输入,并通过 RTCDataChannel 将指定对象和时间戳的 JSON 字符串发送到远程对等方。

js
const pc = new RTCPeerConnection();
const dc = pc.createDataChannel("BackChannel");

function sendMessage(msg) {
  const obj = {
    message: msg,
    timestamp: new Date(),
  };
  dc.send(JSON.stringify(obj));
}

规范

规范
WebRTC:浏览器中的实时通信
# dom-rtcdatachannel-send

浏览器兼容性

另见