WebSocket心跳检测与断线重连示例

WebSocket通过心跳检测与断线重连机制提升连接稳定性,客户端每30秒发送ping,服务端回应pong,超时未响应则判定断线;onclose触发后按指数退避策略重试连接,最多5次,确保网络波动后可靠恢复。

websocket心跳检测与断线重连示例

WebSocket在长时间通信中容易因网络波动或服务端超时导致连接中断。为了确保连接稳定,通常需要实现心跳检测与断线重连机制。下面介绍一种简单有效的实现方式。

心跳检测机制

心跳检测通过定时发送消息确认连接是否正常。客户端和服务端约定一个心跳消息格式,定期互发ping/pong消息。

关键点:

设置定时器,每隔一定时间(如30秒)向服务端发送ping消息服务端收到ping后应答pong客户端记录最后一次收到pong的时间,超时未响应则判定为断线

// 示例:客户端心跳逻辑

let ws;let heartCheck = {  timeout: 30000,  timer: null,  reset: function() {    clearTimeout(this.timer);    return this;  },  start: function() {    this.timer = setInterval(() => {      ws.send('ping');    }, this.timeout);  }};

function connect() {ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {heartCheck.reset().start();};

ws.onmessage = (e) => {if (e.data === 'pong') {heartCheck.reset().start(); // 收到pong,重启心跳}};}

断线重连机制

当连接关闭或心跳超时,自动尝试重新连接,避免频繁重试可设置最大重连次数和间隔时间。

实现要点:

监听onclose事件触发重连设置重连次数限制,防止无限重试使用指数退避策略增加重连间隔

// 示例:断线重连逻辑

let reconnectInterval = 1000;let maxReconnectAttempts = 5;let reconnectAttempts = 0;

ws.onclose = () => {if (reconnectAttempts {reconnectAttempts++;connect();console.log(第 ${reconnectAttempts} 次重连尝试);}, reconnectInterval * Math.pow(2, reconnectAttempts));} else {console.warn('重连次数已达上限');}};

完整示例整合

将心跳与重连结合,形成健壮的WebSocket连接管理。

let ws;let heartCheck = {  timeout: 30000,  timer: null,  reset: function() {    clearTimeout(this.timer);    return this;  },  start: function() {    this.timer = setInterval(() => {      if (ws.readyState === WebSocket.OPEN) {        ws.send('ping');      }    }, this.timeout);  }};

let reconnectInterval = 1000;let maxReconnectAttempts = 5;let reconnectAttempts = 0;

function connect() {ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {reconnectAttempts = 0; // 成功连接,重置重连计数heartCheck.reset().start();};

ws.onmessage = (e) => {if (e.data === 'pong') {heartCheck.reset().start();} else {// 处理正常业务消息console.log('收到消息:', e.data);}};

ws.onclose = () => {heartCheck.reset(); // 清除心跳定时器if (reconnectAttempts {reconnectAttempts++;connect();}, reconnectInterval * Math.pow(2, reconnectAttempts));}};

ws.onerror = () => {console.error('WebSocket错误');};}

// 初始化连接connect();

基本上就这些。心跳加重连能显著提升WebSocket的稳定性,实际项目中可根据需求调整超时时间和重试策略。

以上就是WebSocket心跳检测与断线重连示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1409126.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Go语言结构体初始化:理解值类型与指针类型的选择
上一篇 2025年12月16日 02:06:53
Go语言中fmt.Println()与println()的区别与最佳实践
下一篇 2025年12月16日 02:07:07

相关推荐

  • PHP何时需要同时flush_PHP同时使用flush和ob_flush原因

    先调用ob_flush()将PHP输出缓冲区内容推送到底层,再调用flush()通知服务器立即发送数据,两者配合可穿透PHP和服务器缓冲层,实现输出实时性。 在PHP开发中,flush() 和 ob_flush() 经常被一起调用,目的是为了让输出内容及时发送到浏览器,而不是被缓冲机制延迟。要理解为…

    2026年9月22日
    100
  • PHP实时输出如何与消息队列集成_PHP实时输出与消息队列结合

    答案:PHP通过消息队列解耦耗时任务与用户响应,利用flush()实现实时输出感知,结合RabbitMQ、Redis等队列将任务异步处理,前端通过轮询或SSE获取进度,提升系统性能与用户体验。 PHP 实时输出与消息队列的结合,关键在于解耦耗时任务和即时响应用户。虽然 PHP 本身是同步阻塞的,但通…

    2026年9月22日
    100
  • Workerman如何实现安全防护?Workerman防止攻击措施?

    Workerman应用的安全需从代码、配置和部署多层面构建。首先,所有外部输入必须严格验证和过滤,防止SQL注入、XSS等攻击;其次,以最小权限用户运行Worker进程,避免使用root权限;通过SSL/TLS(WSS)加密通信,保护数据传输安全;在应用层限制单个IP连接数与请求频率,结合Nginx…

    2026年9月11日
    200
  • Workerman性能如何?Workerman支持多少连接?

    Workerman能实现高并发连接的核心在于其事件驱动、非阻塞I/O模型,结合PHP常驻内存机制,避免重复初始化开销;通过epoll/kqueue高效处理大量连接,采用多Worker进程充分利用多核CPU,提升吞吐量。其轻量设计专注网络通信,适用于长连接场景。实际性能受系统文件描述符限制、内存、CP…

    2026年9月11日
    100
  • Workerman怎么进行连接重用?Workerman持久连接管理?

    Workerman通过事件循环和长驻进程实现连接重用,作为服务器时天然保持客户端长连接,作为客户端时在onWorkerStart中初始化数据库、Redis等持久连接,并通过心跳检测与异常捕获实现自动重连,结合Guzzle等支持连接池的HTTP客户端优化后端请求复用,提升性能与稳定性。 Workerm…

    2026年9月10日
    200
  • Swoole怎么获取服务器当前的连接列表

    答案:通过 $server->connections 获取 Swoole 当前活跃连接的 fd 列表,结合 isEstablished 和 connection_info 可管理连接状态,适用于广播、监控等场景。 在 Swoole 中,获取服务器当前的连接列表可以通过 server->c…

    2026年9月9日
    100
  • Swoole怎么在WebSocket中推送消息给指定用户

    首先建立用户ID与fd的映射关系,在用户认证后将user_id与客户端fd绑定并存储于Swoole Table或Redis中;随后通过查询该映射获取目标fd,使用$server->push($fd, $message)向指定用户推送消息,并在on(‘close’)时清除…

    2026年9月9日
    700
  • PHP实时输出如何实现动态加载内容_PHP实时输出动态内容加载

    实现实时输出需先关闭输出缓冲并调用ob_flush()和flush(),逐步发送数据;可通过AJAX轮询或SSE实现动态更新,注意服务器环境缓冲配置。 PHP 实现实时输出动态内容,关键在于让服务器在处理过程中逐步发送数据到浏览器,而不是等待脚本完全执行完毕才输出。这种技术常用于长时间运行的任务、进…

    2026年9月9日
    100
  • Swoole怎么让一个服务监听多个端口

    Swoole通过addlistener方法实现单进程内多端口监听,支持TCP、UDP、SSL等不同协议。1. 创建主服务后调用addlistener可绑定多个IP:Port,每个端口独立设置协议类型;2. 不同端口可分别处理TCP、UDP或SSL连接,适用于常规通信、广播及加密场景;3. 在rece…

    2026年9月9日
    100
  • Swoole的dispatch_mode参数怎么设置最合理

    dispatch_mode影响Worker接收连接方式,共7种模式。模式1轮询适合短连接;模式2固定分配适合长连接粘滞性;模式3抢占式适配协程高并发;模式5基于IP哈希用于会话保持。HTTP服务推荐mode=2或mode=3,TCP长连接可用mode=2/5,UDP建议mode=1或3。配置示例中启…

    2026年9月9日
    100
  • Swoole如何实现一个简单的MQTT服务器

    Swoole可通过TCP服务器实现MQTT协议解析,核心包括处理CONNECT、PUBLISH、SUBSCRIBE等报文,管理客户端订阅关系与消息转发,需手动解析变长头部与主题长度,支持PINGREQ心跳与连接状态维护,配合mosquitto工具测试基础通信,适用于轻量级物联网场景,但生产环境需扩展…

    2026年9月9日
    000
  • Swoole如何实现一个高可用的服务集群

    Swoole通过多节点部署、负载均衡、健康检查与故障转移实现高可用集群。1. 多节点部署结合Consul/Etcd/ZooKeeper实现服务注册与发现;2. Nginx/HAProxy或云LB进行流量分发,确保请求均匀分配;3. 定期健康检查HTTP接口或TCP端口,异常节点自动剔除;4. 统一配…

    2026年9月9日
    100
  • Swoole怎么异步执行一个耗时任务

    Swoole通过Task Worker、Process和协程实现异步任务处理。在Web服务中推荐使用Task Worker,将耗时任务如发邮件、数据导入等投递至task进程异步执行,避免阻塞主进程;可通过task()方法提交任务,在on(‘task’)中处理,完成后触发on(…

    2026年9月8日
    600
  • Swoole怎么处理客户端的异常断开

    Swoole通过心跳机制、close事件监听和发送检测应对客户端异常断开:配置heartbeat_check_interval与heartbeat_idle_time实现连接保活,每30秒检查,60秒无交互则断开;监听close事件清理用户会话、释放资源;发送数据时判断push返回值,失败则关闭fd…

    2026年9月8日
    000
  • Swoole和EasySwoole是什么关系

    EasySwoole是基于Swoole扩展构建的PHP框架,Swoole提供底层异步非阻塞能力,EasySwoole在此基础上封装了HTTP服务、WebSocket、定时任务等组件,形成完整开发框架,使开发者能更高效地专注业务逻辑。 简单来说,Swoole 是一个PHP的底层扩展,而 EasySwo…

    2026年9月8日
    100
  • laravel怎么使用Laravel Echo和Pusher实现前端实时更新_laravel Echo+Pusher前端实时更新方法

    首先配置 Laravel 广播驱动为 Pusher,设置 .env 和 broadcasting.php;接着创建实现 ShouldBroadcast 接口的事件类 MessageSent,指定广播频道和事件名称;然后在前端引入 Pusher 和 Laravel Echo JS 库,初始化 Echo…

    2026年9月8日
    100
  • 石墨文档如何实现多人实时协作编辑_石墨文档团队协作功能的使用技巧

    石墨文档通过WebSocket实现实时协作,创建团队后共享文档并设置可编辑、仅查看、可评论权限,结合@提醒、版本历史、锁定单元格等功能提升效率,确保多人协同流畅。 石墨文档实现多人实时协作编辑,主要依靠其云端同步技术和低延迟的通信机制。多个用户打开同一份文档时,系统会通过WebSocket保持客户端…

    2026年9月8日
    000
  • 在ThinkPHP6中使用Nginx反向代理Websocket

    在近几年的互联网应用中,websocket已经成为了一种非常重要的通信协议。thinkphp6作为一款优秀的php开发框架,也提供了对websocket的支持。不过,在使用websocket时,我们通常会涉及到跨域、负载均衡等问题,因此,在这篇文章中,我们将介绍如何在thinkphp6中使用ngin…

    用户投稿 2026年9月7日
    100
  • 如何使用Swoole实现WebSocket服务器

    websocket已经成为现代web应用程序中的基本元素。它提供一种全双工的通信方式,使得服务器和客户端之间可以实现实时通信。swoole是一个基于php的高性能网络通信框架,它可以非常方便地实现websocket服务器。 本文将介绍如何使用Swoole构建WebSocket服务器。 安装Swool…

    用户投稿 2026年9月5日
    500
  • Swoole如何支持WebSocket的断线重连功能

    websocket已经成为现代web开发的常见协议,它能够在客户端(浏览器)和服务端之间建立一条双向通信通道。然而,网络环境不稳定或者其他未知的原因,可能会导致websocket的意外断连,这会对开发者的开发和维护带来极大的困扰。 Swoole是PHP的一款高性能网络通信框架,它支持WebSocke…

    用户投稿 2026年9月5日
    200

发表回复

登录后才能评论
关注微信