位置: IT常识 - 正文

WebSocket开发(心跳监测)功能(websocket())

编辑:rootadmin
WebSocket开发(心跳监测)功能 前言

推荐整理分享WebSocket开发(心跳监测)功能(websocket()),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:websocket开源库,websocket开源库,websocket 开发,websocket快速入门,websocket快速入门,websocket 开发,websocket 开发,websocket入门教程,内容如对您有帮助,希望把文章链接给更多的朋友!

在之前的文章中完成了客服对话的Demo功能,但是现在的连接是无限制的长时间连接没有做心跳、失活、超时断连等功能,心跳的实现方法有很多种,并且WebSocket就提供了ping/pong类型的消息。

心跳的触发方式也分两种:

客户端触发:如果是前端发送心跳,后端需要返回心跳,也就是ping pong的过程会有两次数据传递。服务端触发:后端来发送心跳的话,就只需要发送ping,前端不需要回应。

这两种后续的处理方式也有各自优缺点。

客户端触发:

优点

灵活控制无需设置主动超时逻辑清晰服务端简单缺点

两次消息传递消息内容容易篡改服务端触发:

优点

节省宽带服务端控制频率消息体固定缺点

处理逻辑复杂需要添加定时任务考虑稳定性

两种方式各有利弊,看具体的应用场景选择心跳方式是最好的,这里使用客户端触发心跳进行Demo实验,前端变更比较容易,服务端也不需要写定时等处理复杂的业务,只需要在收到固定消息后返回对应消息即可。

1. WebSocket心跳

客户端触发心跳的话就是在服务端的OnMessage事件里进行截获处理,如果是接受参数为String,就在之前的逻辑之上加上判断健康检查的逻辑,功能很简单,客户端发送了特点消息直接返回对应的消息即可。

1.1 字符串消息

WebSocket已经设计了心跳,也就是Ping/Pong,这个功能可以到达检测链接是否可用,但是如果要携带数据还是需要自己用字符串、对象的消息类型进行实现。

代码如下:

@OnMessage public void onMessage(String message, Session session,@PathParam("clientId") String clientId){ /** * 持久化 */ baseWebSocketService.saveClientSendMsg(clientId,message,new Date()); /** * 处理消息 */ UserMessageModel userMessageModel = JSONObject.parseObject(message, UserMessageModel.class); if (userMessageModel == null){ this.sendMessage(BaseResponseMessage.error(null,"传递参数结构异常")); } userMessageModel.setSendId(clientId); /** * 健康检查 */ if ("HEALTH".equals(userMessageModel.getMessage())){ this.sendText(WebSocketHealthEnum.HEALTH.result); return; } /** * 发送消息 */ HashMap<String,WebSocketClient> hashMap = webSocketClientMap.get(WebSocketTypeEnum.getAcceptType(this.type)); if (!CollectionUtils.isEmpty(hashMap)){ if (StringUtils.isEmpty(bindKfClients.get(this.clientId))){ List<UserMessageModel> list = new ArrayList(); list.addAll(baseWebSocketService.queryClientSendMsg(clientId)); list.forEach(model-> { this.toCSucceed(model); }); }else{ this.toCSucceed(userMessageModel); } }else{ baseWebSocketService.saveClientCompensateMsg(userMessageModel.getAcceptId(),message,(byte) 0); log.info("客户端:{} 发送消息到接受端:{} 不在线,放置到代发送列表,当前待发送列表:{}条",clientId,userMessageModel.getAcceptId()); this.sendMessage(BaseResponseMessage.error(null,"接收端不在线")); } }

如果客户端发送了内容HEALTH则回复对应消息,我这里回复了SUCCESS

WebSocket开发(心跳监测)功能(websocket())

但是这样有个问题,用户发送了HEALTH这个字符串服务端会将这个消息当作健康检查进行处理,而不是消息,这样影响了用户端的使用。

还记得之前预留了一个发送类型字段sendType吗,这时候这个类型就起作用了,如果要做健康检查的操作就将这个sendType设置为HEALTH,服务端根据sendType字段进行判断业务处理,修改一下代码:

/** * 健康检查 */ if (WebSocketHealthEnum.HEALTH.msg.equals(userMessageModel.getSendType())){ this.sendText(WebSocketHealthEnum.HEALTH.result); return; }1.2 Ping/Pong消息Ping的协议头是0x9,Pong的协议头是0xA控制帧最大载荷为125bytes且不能拆分

服务端可以主动发生Ping/Pong消息,之前文章中写过WebSocket发送消息的四种类型,这里将上面发送Text文本类型换成发送Ping类型的消息,当然也可以发送Pong类型的消息。

代码如下:

if (WebSocketHealthEnum.HEALTH.msg.equals(userMessageModel.getSendType())){ try { session.getBasicRemote().sendPing(ByteBuffer.wrap("SUCCESS".getBytes())); } catch (IOException e) { throw new RuntimeException(e); } return; }

Ping消息是不会被我们的OnMessage事件接收的,所以不需要特殊处理,如果是Pong消息在服务的接收是可以的。

代码如下:

@OnMessage public void onPong(PongMessage pongMessage) { ByteBuffer byteBuffer = pongMessage.getApplicationData(); }

具体的业务可以二次处理

2. 服务心跳

上面的心跳是对每个客户端的心跳监测,服务的心跳也要做,服务的心跳就简单了,前端定时请求HTTP/HTTPS协议接口。

代码如下:

@Slf4j@RestControllerpublic class CheckHealthController { @GetMapping("/health") public ResponeApi health() { log.info("健康检查chatroom-IM --> 检查成功!"); return ResponeApi.success(ResponeCodeEnum.SUCCESS,"SUCCESS"); }}

效果如下:

本文链接地址:https://www.jiuchutong.com/zhishi/299632.html 转载请保留说明!

上一篇:Window.location用法(windowlocation用法)

下一篇:Vue3.0 项目启动(打造企业级音乐App)(vue3.0启动命令)

  • 微信公众号怎么删除已发文章(微信公众号怎么做)

    微信公众号怎么删除已发文章(微信公众号怎么做)

  • 如何给孩子申请一码通(如何给孩子申请银行卡流程)

    如何给孩子申请一码通(如何给孩子申请银行卡流程)

  • 闲鱼举报人对方会知道吗(闲鱼举报成功后对方知道是谁举报的吗)

    闲鱼举报人对方会知道吗(闲鱼举报成功后对方知道是谁举报的吗)

  • 微信老是提示有人尝试登录(微信老是提示有信息,但是打开后却没有,怎么回事)

    微信老是提示有人尝试登录(微信老是提示有信息,但是打开后却没有,怎么回事)

  • 什么叫做编译(什么叫做编译预处理指令)

    什么叫做编译(什么叫做编译预处理指令)

  • 苹果SE是什么基带(iphone se是啥手机)

    苹果SE是什么基带(iphone se是啥手机)

  • 如何删除微信骰子表情(微信中怎样删除)

    如何删除微信骰子表情(微信中怎样删除)

  • 通常所说的微型机主机是指(通常所说的微型计算机的主机主要包括)

    通常所说的微型机主机是指(通常所说的微型计算机的主机主要包括)

  • 微视每天几点刷新(微视每天几点刷视频)

    微视每天几点刷新(微视每天几点刷视频)

  • 天猫发错货赔偿规则(天猫发错货赔偿多少)

    天猫发错货赔偿规则(天猫发错货赔偿多少)

  • 朋友圈仅聊天什么意思(朋友圈仅聊天的意思)

    朋友圈仅聊天什么意思(朋友圈仅聊天的意思)

  • 顺风车注销了还能注册吗(顺风车注销后再注册)

    顺风车注销了还能注册吗(顺风车注销后再注册)

  • 乐视手机怎么自动换壁纸(乐视手机怎么说)

    乐视手机怎么自动换壁纸(乐视手机怎么说)

  • 魅族16s怎么快速打开相机(魅族16th如何)

    魅族16s怎么快速打开相机(魅族16th如何)

  • 如何恢复快手删除作品(如何恢复快手删除的视频)

    如何恢复快手删除作品(如何恢复快手删除的视频)

  • 苹果ios13怎么截长图(ios13.3怎么截图)

    苹果ios13怎么截长图(ios13.3怎么截图)

  • 喵喵机打印不出来怎么办(喵喵机打印不出纸)

    喵喵机打印不出来怎么办(喵喵机打印不出纸)

  • vue可以添加几张照片(vue引入多张图片)

    vue可以添加几张照片(vue引入多张图片)

  • 红米手机的备忘录在哪(红米手机的备忘录怎么画画)

    红米手机的备忘录在哪(红米手机的备忘录怎么画画)

  • 苹果手机网络诊断正在哪里(iphone网络)

    苹果手机网络诊断正在哪里(iphone网络)

  • 简述word中文本替换的方法(简述word中文本框和形状的区别)

    简述word中文本替换的方法(简述word中文本框和形状的区别)

  • excel怎么把表格拉长(excel怎么把表格横竖调换)

    excel怎么把表格拉长(excel怎么把表格横竖调换)

  • 华为畅享9有没有红外线(华为畅享9有没有指纹解锁)

    华为畅享9有没有红外线(华为畅享9有没有指纹解锁)

  • 网易云怎么上传音乐(网易云怎么上传视频)

    网易云怎么上传音乐(网易云怎么上传视频)

  • vue添加自定义音乐(vue 添加自定义属性)

    vue添加自定义音乐(vue 添加自定义属性)

  • 一号店如何联系客服(一号店如何联系人工服务)

    一号店如何联系客服(一号店如何联系人工服务)

  • sz命令  基于ZModem协议下载文件到本地(linux sz命令使用)

    sz命令 基于ZModem协议下载文件到本地(linux sz命令使用)

  • 股东利润分配怎么做账
  • 研发活动计入当期损益怎么计算
  • 固定资产开专票怎么记凭证
  • 增值税申报时有0.1元差额,怎么申报
  • 原材料被盗计入什么科目
  • 门诊药房主要业务
  • 存货盘亏计入什么收入
  • 三栏式和多栏式的账目有哪些
  • 金税三期收费吗
  • 集团内部是什么意思
  • 工地水电包公包料的细节
  • 转让股权原值的相关资料
  • 理财产品分红怎么入账
  • 租赁车辆维修费谁承担
  • 小规模纳税人普票可以开3%吗
  • 工资表中有哪些项目
  • 资产负债率70%说明长期偿债能力
  • 个人向公司借贷需要交税吗
  • 亏损合同如何处理
  • 出口退税过期了怎么办理
  • 拆迁的支出费用包括哪些
  • 申报专利 费用
  • 无形资产增值税计入入账价值吗
  • 预付办公用品费用,未收到发票
  • 营业利润是怎么计算的?
  • 存货 计价
  • 花卉绿萝的养殖方法
  • echarts3d地图
  • 固定资产一次性加速折旧
  • 土地增值税清算全流程实战案例
  • 支付的食堂费用怎么入账
  • Yii2表单事件之Ajax提交实现方法
  • php traits
  • 拔缴经费收入
  • 后端中spef文件和spf文件
  • vue富文本编辑器移动端
  • Cookie和Session的区别,各自的使用方法及常用操作
  • eccv论文下载
  • tcpdump 监听指定端口
  • 下载下来是php
  • php curl_setopt
  • php获取flag
  • ps怎么参考线快捷键
  • 农民专业合作社是企业法人吗
  • 财政补助结转和财政补助结余
  • 交通费怎么报销
  • 关于转租电费收取规定
  • access2016备注型
  • sqlserver 判断函数
  • 契税和印花税的会计分录
  • 公司购买手表入什么科目
  • 社保费阶段性减免政策到什么时候
  • 已抵扣的进项税额转出怎么做会计分录
  • 过路费油费计入什么费用
  • 公司打款账号模板图片
  • 国企背书是什么意思
  • Mysql 1864 主从错误解决方法
  • linux彻底卸载软件
  • win10预览版21390
  • windows导航栏在左边
  • winxp系统提速
  • win10升级后无法进入系统一直重启
  • Ubuntu Linux 7.04QQ、MSN 安装和使用方法
  • win8自动启动项怎么设置
  • win7用超级管理员登录
  • ztree默认选中
  • 2014年最火的英文歌
  • linux终端命令行和输出在一行
  • activity怎么用
  • vim命令详解
  • 一个页面
  • java编程基础知识入门
  • js中key
  • javascript基础笔记
  • 微博html代码
  • 税务局六大攻坚
  • 分公司的总公司
  • 怎么查国税
  • 青岛国税服务电话
  • 国企重组裁员政策解读
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设