Swoole从入门到入土(18)——WebSocket服务器[心跳ping]

2023-11-18

        由于 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帧中相同的数据

下一篇:Swoole从入门到入土(19)——WebSocket服务器[文件传输]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • js如何获取当前时间、前几个月或后几个月时间

    获取当前的时间 格式为 YYYY MM DD function getNowTime var year nowDate getFullYear var month nowDate getMonth 1 lt 10 0 nowDate get
  • 安装scikit-learn的详细过程

    1 打开命令终端 检查Python和pip的版本 scikit learn支持的Python版本是3 6及以上 pip版本最低为9 0 1 2 升级pip版本 可选 使用命令 pip install user upgrade pip 升级p
  • MySQL substr函数使用详解

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 MySQL数据库快速入门 substr函数 一 作用 二 语法 三 使用 1 截取字符串 2 截取
  • (数据科学学习手札52)pandas中的ExcelWriter和ExcelFile

    一 简介 pandas中的ExcelFile 和ExcelWriter 是pandas中对excel表格文件进行读写相关操作非常方便快捷的类 尤其是在对含有多个sheet的excel文件进行操控时非常方便 本文就将针对这两个类的使用方法展开
  • TP框架修改后台路径方法

    直接映射 admin 后台修改路径为 myadmin888 文章来源 外星人来地球 欢迎关注 有问题一起学习欢迎留言 评论 转载于 https www cnblogs com lovebing p 11579639 html
  • 青蛙过河 蓝桥杯 2097

    问题描述 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1
  • 自动驾驶:轨迹预测综述

    自动驾驶 轨迹预测综述 轨迹预测的定义 轨迹预测的分类 基于物理的方法 Physics based 基于机器学习的方法 Classic Machine Learning based 基于深度学习的方法 Deep Learning based
  • Java全栈面试题(三)--Redis

    对Redis的理解 Redis是一款开源的高性能键值对存储系统 支持多种数据类型 如字符串 哈希 列表 集合 有序集合等 主要用于缓存 消息队列 排行榜 计数器等场景 能够提供快速读写 高并发 持久化等功能 Redis是单线程的 通过采用多
  • java -jar后台启动的四种方式

    Linux系统启动java项目四种方法 1 用java jar xxx jar 点击回车就会启动成功 但是当退出或者关闭远程工具就会把进程关闭 以上就是启动的项目Java jar xxx jar 但是点击过Ctl c或者把此窗口关闭 就会杀
  • 【Linux】shell命令与文件权限

    目录 前言 shell命令以及运行原理 Linux权限的概念 1 文件访问者的分类 人 2 文件类型和访问权限 事物属性 3 文件权限值的表示方法 4 文件访问权限的相关设置方法 4 1 chmod指令 4 2 chown指令 4 3 ch
  • 计算机应届博士生的一点求职经验——华为篇

    一点也许有用的求职经验与感悟 前言 机考 技术面试 主管面试 HR面试 性格测试 思考与选择 前言 华为的应届生申请可以填写2个志愿 一共有五道考核 机考 必做 2轮技术面试 部门主管面试 HR 面试和性格测试 本文会对这几个方面分别展开
  • 解决neo4j导入数据时报错:neo4j already contains data, cannot do import here报错

    完整报错如下 java lang IllegalStateException neo4j already contains data cannot do import here at org neo4j internal batchimpo
  • Android Webview 部分图片显示不出来问题

    最近发现在华为Mate 10 上面我们app的内置webview会有部分图片不展示 直接就图裂了 经过绕了一大圈后才解决了问题 其实问题原因很简单 但是分析过程不顺利 拿出来分享下 希望可以帮助大家少走弯路 简单说下这个问题的背景 1 我们
  • Geoffrey Hinton、姚期智、张钹、Sam Altman等专家共话AI安全与对齐丨2023智源大会议程公开...

    6月9日 2023北京智源大会 将邀请AI领域的探索者 实践者 以及关心智能科学的每个人 共同拉开未来舞台的帷幕 你准备好了吗 与会知名嘉宾包括 图灵奖得主Yann LeCun OpenAI创始人Sam Altman 图灵奖得主Geoffr
  • stata如何看某个命令的options?即逗号后面可以加上哪些命令

    以codebook这一命令为例 在命令窗口输入 help codebook 则会出现以下内容
  • mysql text多少字节_mysql里面text能存多大的数据

    展开全部 最多可以存储65535字节来数据 源 在mysql中 文本文件bai存储从0到65 535字节 du64KB 的字节 因此 mysql中的文zhi本最多可以dao存储65 535字节 文本文件有四种类型 tinytext Text
  • 05_numpy学习笔记(下):大作业

    大作业回顾 1 导入鸢尾属植物数据集 保持文本不变 知识点 输入和输出 如何导入存在数字和文本的数据集 numpy loadtxt 2 求出鸢尾属植物萼片长度的平均值 中位数和标准差 第1列 sepallength 知识点 统计相关 如何计
  • vue3组件之间通信(三)——爷孙组件传递属性和方法

    文章目录 1 setup函数传递属性和方法 attrs 1 代码 2 主要代码和详细讲解 3 注意点 2 script setup 语法糖传递属性和方法 1 代码 2 主要代码和详细讲解 3 注意点 前言 爷孙组件使用prop一层一层传值和
  • drag diffusion中的gradio代码逐行解析

    gradio库是一个用于创建简单web应用程序的库 允许用户通过浏览器和程序进行交互 1 gr Blocks 使用with创建 在with中创建的任何组件都会自动添加到应用程序中 组件按创建顺序垂直显示在应用中 Blocks 模块用于组件在
  • Swoole从入门到入土(18)——WebSocket服务器[心跳ping]

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