由于 WebSocket 是长连接,如果一定时间内没有通讯,连接可能会断开。这时候需要心跳机制,WebSocket 协议包含了 Ping 和 Pong 两个帧,可以定时发送 Ping 帧来保持长连接。

1、心跳原理图:

 2、websocket协议控制帧描述

Control frames are identified by opcodes where the most significant bit of the opcode is 1.

Currently defined opcodes for control frames include 0x8 (Close), 0x9 (Ping), and 0xA (Pong). Opcodes 0xB-0xF are reserved for further control frames yet to be defined.

Control frames are used to communicate state about the WebSocket.

Control frames can be interjected in the middle of a fragmented message.

All control frames MUST have a payload length of 125 bytes or less and MUST NOT be fragmented.

从原文可知,Ping的协议头是0x9,Pong的协议头是0xA,控制帧最大载荷为125bytes且不能拆分

3、代码示例:

1) 发送ping帧

use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server; $server = new Server('127.0.0.1', 9501);
$server->on('message', function (Server $server, Frame $frame) {
$pingFrame = new Frame;
$pingFrame->opcode = WEBSOCKET_OPCODE_PING;
$server->push($frame->fd, $pingFrame);
});
$server->start();

2) 响应ping帧

$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
if ($frame->opcode == 0x09) {
echo "Ping frame received: Code {$frame->opcode}\n";
// 回复 Pong 帧
$pongFrame = new Swoole\WebSocket\Frame;
$pongFrame->opcode = WEBSOCKET_OPCODE_PONG;
$server->push($frame->fd, $pongFrame);
} else {
echo "Message received: {$frame->data}\n";
}
});

4、关于ping与pong的结论

· 心跳包中可能会携带数据
· 当收到Ping帧的时候需要立即返回一个Pong帧
· 在连接建立之后,随时都可以发送Ping帧
· 心跳是用来测试链接是否存在和对方是否在线
· 在响应Ping帧的的Pong帧中,必须携和被响应的Ping帧中相同的数据

笔者注:目前没有找到用JS websocket发送ping帧的资料,如果哪位大佬有相关的说明,请不吝赐教。

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

Swoole从入门到入土(18)——WebSocket服务器[心跳ping]的更多相关文章

  1. Swoole学习(五)Swoole之简单WebSocket服务器的创建

    环境:Centos6.4,PHP环境:PHP7 服务端代码 <?php //创建websocket服务器 $host = '0.0.0.0'; $port = ; $ws = new swool ...

  2. swoole创建websocket服务器

    目录 1 安装准备 1.1 安装swoole前必须保证系统已经安装了下列软件 1.2 下载并解压 1.3 编译安装成功后,修改php.ini 2 构建Swoole基本实例 2.1 tcp服务器实例 2 ...

  3. 04.swoole学习笔记--webSocket服务器

    <?php //创建webSocket服务器 $serv=); //获取请求 //on //open 建立连接 $serv:服务器 $request:客户端信息 $serv->on('op ...

  4. Erlang cowboy websocket 服务器

    Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...

  5. Oracle数据库基础入门《一》Oracle服务器的构成

    Oracle数据库基础入门<一>Oracle服务器的构成 Oracle 服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统,也是一 个高效的 SQL 语句执行环境. Oracle ...

  6. 如何用Baas快速在腾讯云上开发小程序-系列1:搭建API & WEB WebSocket 服务器

    版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221059001487422606 来源:腾云阁 h ...

  7. 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的 ...

  8. WebSocket服务器

    //创建websocket 服务器  ws_server.php //https://wiki.swoole.com/wiki/page/479.html //创建websocket服务器对象,监听0 ...

  9. HTML5学习总结-08 WebSocket 服务器推送

    一 WebSocket 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展 ...

  10. python实现websocket服务器,可以在web实时显示远程服务器日志

    一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...

随机推荐

  1. 【TouchGFX】屏幕概念

    Screen构成 界面布局 View, 逻辑处理 Presenter Currently Active Screen 因TouchGFX分配内存的的方式是,按照最大的Screen分配,即最大View+ ...

  2. CSS - 使用CSS 3D属性来完成页面视差滚动效果。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 探讨Java死锁的现象和解决方法

    死锁是多线程编程中常见的问题,它会导致线程相互等待,无法继续执行.在Java中,死锁是一个需要注意和解决的重要问题.让我们通过一系列详细的例子来深入了解Java死锁的现象和解决方法. 1. 什么是死锁 ...

  4. [转帖]银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新

    银河麒麟v10下载(服务器版 桌面版) - 2023-11-14更新 如需转载请标明出处:[http://blog.csdn.net/itas109] 文章目录 银河麒麟v10下载(服务器版 桌面版) ...

  5. [转帖]在麒麟linux上安装Postgresql12.5

    https://jimolonely.github.io/tech/linux/install-postgresql-kylin/ 本文主要实践在麒麟V10版本上通过源码编译安装PostgreSQL1 ...

  6. 【转帖】一篇文章让你了解灾备指标:RPO与RTO

    RTO 和 RPO 都是企业灾难恢复(Disaster Recovery, DR)需要考虑的关键指标,这两个指标可以用来指导企业来制定合适的业务系统服务或数据的恢复方案. RPO(Recovery P ...

  7. [转帖]面对龙芯3A5000的逼迫,3A4000要为生存抗争!

      https://baijiahao.baidu.com/s?id=1709233817860985518&wfr=spider&for=pc 龙芯3A5000是龙芯中科自主设计的最 ...

  8. [转帖]12.计算机网络---iptables防火墙管理工具

    文章目录 一.防火墙基础知识 1.1 防火墙是什么? 1.2 iptables基础知识 1.3 netfilter和iptables的关系: 1.4 新型防火墙工具:firewalld 二.iptab ...

  9. Linux策略路由详解

    概述 在Linux中,我们通常使用route命令来做路由信息的管理.但是该命令仅仅只能用于基本路由信息的管理,面对功能更加强大的基于策略的路由机制,route命令就显得捉襟见肘.在传统路由算法中,只能 ...

  10. vscode推荐插件

    js相关的插件 JavaScript (ES6) code snippets Babel ES6/ES7 html css 汉化 Chinese (Simplified) (简体中文) Languag ...