因为我在更常规的基础上使用WebSocket连接,所以我对引擎盖下的工作方式很感兴趣.所以我在无尽的规范文档中挖掘了一段时间,但到目前为止,我真的找不到关于chunking the transmission stream itself的任何东西.
WebSocket协议称其为data frames(它描述了纯数据流,因此也被称为non-control frames).就我对规范的理解而言,没有定义的最大长度和定义的MTU(最大传输单位)值,这反过来意味着单个WebSocket数据帧可能包含,按规范(!),大量的数据(如果我错了,请纠正我,我仍然是这方面的学生).
读完这篇文章后,我立即安装了我的小型Node WebSocket服务器.因为我有一个强大的Ajax历史(也在流媒体和Comet上),我最初的期望是"there must be some kind of interactive mode for reading data while it is transfered".但我错了,不是吗?
我一开始很小,有4kb个数据.
server
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
正如预期的那样,它作为一个数据块到达客户机
client
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
所以我增加了有效载荷,实际上我又在期待,在某个时刻,客户端onmessage
处理器会重复emits ,有效地拦截传输.但令我震惊的是,它从未发生过(node-server,在firefox、chrome和safari客户端上进行了测试).我最大的有效载荷是80 MB
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
它仍然以一个 Big Data 块的形式出现在客户机上.当然,即使你的人脉很好,这也需要一段时间.这里的问题是
- is there any possiblity to chunk those streams, similar to the XHR readyState3 mode ?
- is there any size limit for a single ws data-frame ?
- are websockets not supposed to transfer such large payloads? (which would make me wonder again why there isn't a defined max-size)
我可能仍然从错误的Angular 看待WebSocket,可能根本不需要发送大量数据,在发送之前,您应该自己逻辑地对任何数据进行块/拆分?