如果我要发送大量Blob
or ArrayBuffer
通过 JavaScriptWebSocket
通过其send
方法...是否send
方法调用会阻塞,直到发送数据为止,还是会复制数据以异步发送,以便调用可以立即返回?
一个相关的(未回答的)问题是,从我的解释来看,一系列快速发送是否会导致 onmessage 事件延迟,正如有人描述的在 Mobile Safari 中发生的情况:移动 Safari 上 JavaScript websocket 中的明显阻塞行为 https://stackoverflow.com/questions/17219963/apparent-blocking-behaviour-in-javascript-websocket-on-mobile-safari
根据描述bufferedAmount
属性,我推断出send
必须立即返回,否则bufferedAmount
永远为零。如果它非零,则必须有从先前的发送调用中缓冲的数据,并且如果发送缓冲数据,则没有理由阻止它。
From http://dev.w3.org/html5/websockets/ http://dev.w3.org/html5/websockets/
The 缓冲量属性必须返回的字节数
已排队的应用程序数据(UTF-8 文本和二进制数据)
使用send()但是,截至上次事件循环启动时
正在执行任务,尚未传输到网络。 (这
因此包括当前任务执行期间发送的任何文本,
无论用户代理是否能够传输文本
与脚本执行异步。)这不包括框架
协议产生的开销,或操作完成的缓冲
系统或网络硬件。如果连接关闭,则此
属性的值只会随着每次调用而增加send()方法(连接关闭后该数字不会重置为零)。
在这个简单的例子中,缓冲量属性用于确保
更新以每 50 毫秒一次更新的速率发送,如果
网络可以处理该速率,或者网络可以处理的任何速率
处理,如果太快的话。
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
The 缓冲量属性也可用于使网络饱和
无需以高于网络处理能力的速率发送数据,
尽管这需要随着时间的推移更仔细地监控属性的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)