15

如果我通过它的方法发送一个大的BlobArrayBuffer通过一个 JavaScript ... 在发送数据之前,方法调用是否会阻塞,或者它是否会复制数据以异步发送以便调用可以立即返回?WebSocketsendsend

一个相关的(未回答的)问题是,从我的解释来看,一系列快速发送是否会导致 onmessage 事件被延迟,正如有人似乎在 Mobile Safari 中描述的那样:移动 Safari上 JavaScript websocket 中的明显阻塞行为

4

1 回答 1

10

根据bufferedAmount属性的描述,我推断send必须立即返回,否则bufferedAmount将始终为零。如果它不为零,则必须从先前的 send 调用缓冲数据,如果 send 缓冲数据,则没有理由阻塞。

来自http://dev.w3.org/html5/websockets/

bufferedAmount属性必须返回已使用send()排队的应用程序数据(UTF-8 文本和二进制数据)的字节数,但截至最后一次事件循环开始执行任务时,尚未传输到网络。(因此,这包括在当前任务执行期间发送的任何文本,无论用户代理是否能够与脚本执行异步传输文本。)这不包括协议产生的帧开销,或操作系统完成的缓冲或网络硬件。如果连接关闭,该属性的值只会随着每次调用send() 方法而增加(一旦连接关闭,数字不会重置为零)。

在这个简单的示例中,bufferedAmount属性用于确保以每 50 毫秒一次更新的速率发送更新(如果网络可以处理该速率),或者以网络可以处理的任何速率(如果太快)。

var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
    setInterval(function() {
       if (socket.bufferedAmount == 0)
           socket.send(getUpdateData());
    }, 50);
};

bufferedAmount属性还可用于使网络饱和,而无需以高于网络处理能力的速率发送数据,尽管这需要随着时间的推移更仔细地监控属性的值。

于 2013-08-16T00:28:59.737 回答