gpt4 book ai didi

javascript - 分块 WebSocket 传输

转载 作者:IT老高 更新时间:2023-10-28 21:54:21 28 4
gpt4 key购买 nike

因为我在更常规的基础上使用 WebSocket 连接,所以我对事情在幕后的工作方式很感兴趣。因此,我研究了无休止的规范文档一段时间,但到目前为止,我真的找不到任何关于对传输流本身进行分 block

WebSocket 协议(protocol)称其为数据帧(描述的是纯数据流,因此也称为非控制帧)。据我了解规范,没有定义的最大长度和没有定义的 MTU(最大传输单元)值,这反过来意味着单个 WebSocket 数据帧可能包含,通过规范(!),无限量的数据(如果我在这里错了,请纠正我,我仍然是这方面的学生)。

读完之后,我立即设置了我的小 Node WebSocket 服务器。由于我有很长的 Ajax 历史(也在流媒体和 Comet 方面),我最初的期望是,“必须有某种交互模式来在传输数据时读取数据”。但我错了,不是吗?

我从小规模开始,只有 4kb 的数据。

服务器

testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );

正如预期的那样,它作为一个数据 block 到达客户端

客户

wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};

所以我增加了有效负载,实际上我再次期待,在某些时候,客户端 onmessage 处理程序将重复触发,有效地分 block 传输。但令我震惊的是,它从未发生过(node-server,在 firefoxchromesafari 客户端上进行了测试-边)。我最大的有效负载是 80 MB

testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );

它仍然到达客户端的一个大数据 block 中。当然,即使您的连接非常好,这也需要一段时间。这里的问题是

  • 是否有可能对这些流进行分 block ,类似于 XHR readyState3 模式
  • 单个 ws 数据框是否有大小限制
  • websockets 不应该传输这么大的负载吗? (这让我再次想知道为什么没有定义最大尺寸)

我可能仍然从错误的 Angular 看待 WebSockets,可能不需要发送大量数据,您应该在发送之前自己逻辑地分 block /拆分任何数据?

最佳答案

首先,您需要区分浏览器中的WebSocket 协议(protocol)和WebSocket API

WebSocket 协议(protocol)的帧大小限制为 2^63 个八位字节,但 WebSocket 消息可以由无限数量的帧组成。

浏览器中的 WebSocket API 不公开基于帧或流的 API,而仅公开基于消息的 API。传入消息的负载在提供给 JavaScript 之前总是被完全缓冲(在浏览器的 WebSocket 实现中)。

其他 WebSocket 实现的 API 可以提供对通过 WebSocket 协议(protocol)传输的有效负载的基于帧或流的访问。例如,AutobahnPython做。您可以在此处的示例中阅读更多信息 https://github.com/tavendo/AutobahnPython/tree/master/examples/twisted/websocket/streaming .

披露:我是 Autobahn 的原作者,为 Tavendo 工作。

更多注意事项:

只要浏览器JS WebSocket API中没有frame/streaming API,就只能接收/发送完整的WS消息。

单个(普通)WebSocket 连接不能交错多条消息的负载。因此,即如果您使用大消息,它们会按顺序传递,并且您将无法在大消息仍在运行时发送小消息。

即将推出的 WebSocket 扩展(扩展是扩展协议(protocol)的内置机制):WebSocket 多路复用。这允许在单个底层 TCP 连接上拥有多个(逻辑)WebSocket 连接,这具有多种优势。

另请注意:今天,您可以从单个 JS/HTML 页面打开多个 WS 连接(通过不同的底层 TCP)到单个目标服务器。

另请注意:您可以在应用层自己“分 block ”:以较小的 WS 消息发送您的内容,然后自己重​​新组装。

我同意,在理想情况下,您应该在浏览器中拥有消息/帧/流 API 以及 WebSocket 多路复用。这将提供所有的功能和便利。

关于javascript - 分块 WebSocket 传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13010354/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com