当前位置: 首页 > 知识库问答 >
问题:

在WebSockets中实现permessagedeflate

赫连棋
2023-03-14

我在理解和实现WebSocket中的permessage deflate扩展时遇到了一个问题。

到目前为止,我已经在握手代码中添加了“Sec-WebSocket-扩展: perMessage-收缩”。它似乎一切正常。

然而,当我从服务器(Node.js)向客户端(js)发送一条“TEST”消息时,似乎浏览器(Chrome和Firefox)本身并没有解压缩数据。

如何使用permessagedeflate扩展正确地实现数据压缩和解压缩?

请求报头:

GET ws://localhost/ HTTP/1.1
Host: localhost
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: null
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: X3RofjiYbzVR8zUPI5ZI6w==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: Exodus_101

响应标题:

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
sec-websocket-accept: sFO1Id30BZe63QWcm894hnnb+Pg=
Sec-WebSocket-Protocol: Exodus_101
Sec-WebSocket-Extensions: permessage-deflate

共有1个答案

周培
2023-03-14

服务器和客户端都使用在开始握手期间协商的参数,按每条消息压缩WebSocket数据消息的有效负载数据部分

在握手过程中,使用perMessage-flate标头来指示连接是否应该使用压缩。

  1. 当客户机发送websocket请求时,如果客户机浏览器支持,则会在websocket extensions标头中取消发送的permessage。服务器知道客户端是否支持基于此头的压缩

一旦服务器和客户端都决定使用压缩,他们就必须单独使用压缩技术压缩消息。也就是说,您必须在服务器上通过使用"perMessageDeflate"选项来启用压缩,同时创建web套接字服务器。ws节点模块通过以下方式实现这一点默认。ws模块负责标头标志,因此您不需要隐式设置它。

注意:Deflate使用LZ77和霍夫曼编码的组合来压缩数据。client_max_window_bits;server_max_window_bits=10头标志用于设置LZ77算法用于减少内存开销的自定义缓冲区/滑动窗口。

 类似资料:
  • null 如果我们等待的时间足够长,就会出现超时,导致客户端上出现以下消息。 这就是我在使用长轮询时所面临的问题。它停止进程以防止服务器过载,不是吗?

  • 我计划开发一个基于web的聊天应用程序,它接收ReSTful请求,将它们转换为XMPP,并将它们发送到XMPP服务器。 在这种基于聊天的应用程序中使用WebSocket看起来很有希望,因为事件(或响应)可以异步传递。但是,如果我使用WebSocket作为从浏览器传输请求的底层协议,这仍然可以被视为ReSTful设计吗?如果是的话,URI、动词(GET、POST…)是怎样的,websocket消息中

  • 与最新的Spring 4教程中的STOMP和SockJS一样,我们发现了以下类型的RequestMapping: 家庭控制器。JAVA 现在,我试图通过修改此requestmapping来实现多通道支持: MessageMapping不起作用,sendTo不返回到单独指定的URL。虽然我确实订阅了正确的频道,并且消息没有出现问题,如图所示 调试日志: 正在打开Web套接字。。。跺脚js:130 W

  • 我正在构建一个复杂的聊天应用程序,使用WebSockets。我使用Node.js的socket.io库来实现协议。我应该为每个聊天创建单独的命名空间,还是为每个聊天创建单独的房间? socket.io中名称空间和房间的主要区别是什么?

  • 网关是用@WebSocketGateway()装饰器注解的类。默认情况下,网关使用 socket.io包,但也提供了与广泛的其他库的兼容性,包括本地web套接字实现(阅读更多)。 ?> 提示网关的行为与简单的提供者相同,因此它可以毫不费力地通过构造函数注入依赖关系。另外,网关也可以由其他类(提供者和控制器)注入。 安装 首先,我们需要安装所需的软件包: $ npm i --save @nestjs

  • 我目前的设置是运行多个节点实例,使用PM2来管理实例并充当负载平衡器。 目前,我正在npm上使用包,但如果有更好的替代方案,我绝不会与此联系在一起。 我希望套接字或多或少地推送数据单向从服务器到客户机,避免任何来自客户机到服务器。 到目前为止,我的解决方案是旋转另一个单独充当websocket服务器的节点实例。 我不确定这是最好的选择,我正在尝试看看是否有其他推荐的方法来管理跨多个节点实例的web