我有一个node.js ws websocket接收压缩数据。
文档对于膨胀机制非常浅薄,但从阅读源文件来看,它显然是内置的,应该根据接收数据的类型自动激活。
但是,在附加ws.on('message',function(data){})
事件时,它会返回< Buffer >
由于我知道这些流之前已经用Pako充气,我试图安装它,它实际上使用以下代码:
pako.inflate(data, { to: 'string' })
根据我的理解,两个模块都使用zlib解压缩,但是ws模块以某种方式错过了它。
有人可以给出合理的解释或者至少有一个假设吗?
答案 0 :(得分:2)
ws
支持的是一个名为“permessage-deflate”的特定WebSocket扩展。
此扩展记录在RFC 7692中,因为它是协议的扩展,它是底层WS协议实现(服务器和客户端)需要支持的东西(涉及客户端和服务器尝试确定对方是否支持它,并且发送方设置特定的帧标志以通知接收方该帧已被压缩。)
一旦激活,它就相对透明,并且协议驱动程序会自动处理帧(de)压缩。
在你的情况下,听起来在WebSocket上添加了一个显式的压缩/解压缩阶段,其中发送者显式压缩数据(而不是WS帧本身),接收者需要明确地解压缩它,这基本上是什么你已经发现:收到的消息是(压缩的)缓冲区,你需要明确地解压缩它。
所以ws
并没有错过任何东西,只是在原始WS帧之上的层中发生(de)压缩(如果“permessage-deflate”扩展将处于活动状态,可能导致数据被压缩和解压缩两次:一次是用户代码,一次是协议代码。)