怎样发送websocket的ping帧

如题所述

你可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。在以前 HTTP 协议中所谓的 keep-alive connection 是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有新数据。这两种模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。它们建立的“长连接”都是伪.长连接,只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现。

WebSocket 解决的第一个问题是,通过第一个 HTTP request 建立了 TCP 连接之后,之后的交换数据都不需要再发 HTTP request了,使得这个长连接变成了一个真.长连接。但是不需要发送 HTTP header就能交换数据显然和原有的 HTTP 协议是有区别的,所以它需要对服务器和客户端都进行升级才能实现。在此基础上 WebSocket 还是一个双通道的连接,在同一个 TCP 连接上既可以发也可以收信息。此外还有 multiplexing 功能,几个不同的 URI 可以复用同一个 WebSocket 连接。这些都是原来的 HTTP 不能做到的。

另外说一点技术细节,因为看到有人提问 WebSocket 可能进入某种半死不活的状态。这实际上也是原有网络世界的一些缺陷性设计。上面所说的 WebSocket 真.长连接虽然解决了服务器和客户端两边的问题,但坑爹的是网络应用除了服务器和客户端之外,另一个巨大的存在是中间的网络链路。一个 HTTP/WebSocket 连接往往要经过无数的路由,防火墙。你以为你的数据是在一个“连接”中发送的,实际上它要跨越千山万水,经过无数次转发,过滤,才能最终抵达终点。在这过程中,中间节点的处理方法很可能会让你意想不到。

比如说,这些坑爹的中间节点可能会认为一份连接在一段时间内没有数据发送就等于失效,它们会自作主张的切断这些连接。在这种情况下,不论服务器还是客户端都不会收到任何提示,它们只会一厢情愿的以为彼此间的红线还在,徒劳地一边又一边地发送抵达不了彼岸的信息。而计算机网络协议栈的实现中又会有一层套一层的缓存,除非填满这些缓存,你的程序根本不会发现任何错误。这样,本来一个美好的 WebSocket 长连接,就可能在毫不知情的情况下进入了半死不活状态。

而解决方案,WebSocket 的设计者们也早已想过。就是让服务器和客户端能够发送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-12-22

自行打包字节数组,开头按照这个格式
看到蓝色部分,你就知道怎么发ping和pong的包了。

Websocket 使用指南
在 JavaScript 中,WebSocket 并没有开放 ping\/pong 的 API,需要在我们开发时与服务端约定好一个自实现的心跳机制。Websocket 是建立与 TCP 之上,与 HTTP 协议关系体现在建连阶段借助于 HTTP,连接阶段与 HTTP 无关。建连阶段的 HTTP 请求中,请求头中多了 Connection、Upgrade、Sec-WebSocket-Key ...

JS基础系列之 —— WebSocket
2. 学习要点:理解WebSocket建立连接的过程,包括客户端发起升级请求、服务器响应升级以及数据帧格式(包括FIN、RSV、Opcode、Mask、Payload length等)的解析。3. 数据传递:WebSocket数据以分片形式传输,FIN标志区分最后一个分片,Ping-Pong帧用于维持连接的活跃。关闭连接只需发送一次关闭帧。4. 示例应用:...

socket.io的详细工作流程是怎样的?
前端初始进行长轮询,发送请求等待服务端响应,再发送下一次请求实现双向通信。当升级为 WebSocket 时,前端检测浏览器支持情况,若支持则启动 WebSocket 连接,并通过 ping-pong 测试网络状态。WebSocket 帧结构包括数据包类型,如 ping(2)、pong(3)、message(4)。socket.io 在 engine.io 基础上封装,提...

Qt网络编程:QWebSocket、QWebSocketServer
使用给定的请求或 URL 打开 WebSocket 连接。11. Ping 服务器方法(ping)向服务器发送 Ping 消息以验证连接。12. 获得 pong 信号(pong)当收到 pong 消息时发出,表示对先前 Ping 的响应。13. 共享密钥验证要求信号(preSharedKeyAuthenticationRequired)与 SSL 验证相关。14. 代理认证要求信号(proxy...

用webSocket发送消息怎么确定用户收到消息了
就可能在毫不知情的情况下进入了半死不活状态。而解决方案,就是让服务器和客户端能够发送 Ping\/Pong Frame(RFC 6455 - The WebSocket Protocol)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。

WebSocket 从入门到入土
工作流程握手阶段:包含握手步骤,建立连接数据传输:双向通信,消息切割为帧发送和接收ping-pong控制帧:维护连接活跃度关闭阶段:断开连接时的步骤帧结构与控制帧数据帧由帧头和有效载荷构成,控制帧如Ping、Pong和Close有其特定格式。JavaScript操作通过JavaScript的WebSocket对象,创建连接、发送和接收消息,...

在众多websocket的实现中,有onerror处理,想知道何时onerro
目前,API并未暴露这些功能。用户代理可根据需要发送Ping和未请求的Pong帧,例如维持本地网络NAT映射、检测断开连接或展示延迟指标给用户。然而,API并未提供这些功能,建议自行实现。此外,参考讨论,如Bug 13104 - Enable keepalive on WebSocket API,对于keep-alive功能的启用提出了需求。

HTML5 websocket 能实现Ping功能吗
普通的Ping功能,像图片Ping。只能单向通信。websocket支持全双工、跨域通信。如果你只的是这个的话,websocket是完全可以的。之前有很多个朋友问了我用java结合websocket通信的问题。因此我特意录了一个视频。使用tomcat 的Servlet搭建WebSocket服务器。如果你是学Java的。需要这个视频。留下QQ邮箱,我发给你...

jmeter长连接怎么配置
用WebSocket Sampler登录成功后,立马退出连接,因为服务器通过发送ping消息,客户端返回pong消息来保持连接,加了循环发送pong消息,但在发pong消息之前就已经退出了。

如何处理sec-websocket-version
服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。5.2 帧协议 WebSocket数据帧结构如下图所示:0 1 2 3 0 1 2 3 4 5 6 7 8 9...

相似回答