位置: 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启动命令)

  • 三星watch4建议买吗(三星watch4怎么样)

    三星watch4建议买吗(三星watch4怎么样)

  • 一个让人清醒的故事(一个让我清醒的人)

    一个让人清醒的故事(一个让我清醒的人)

  • 华为Nova5Pro有没有消息指示灯吗(华为nova5pro有没有红外遥控)

    华为Nova5Pro有没有消息指示灯吗(华为nova5pro有没有红外遥控)

  • 苹果7p主板漏电症状(苹果笔记本电池不充电怎么回事)

    苹果7p主板漏电症状(苹果笔记本电池不充电怎么回事)

  • 微信视频几分钟能发送(微信视频几分钟发不出去)

    微信视频几分钟能发送(微信视频几分钟发不出去)

  • 手机没有电池 直接充电能开机吗(手机没有电池会爆炸吗)

    手机没有电池 直接充电能开机吗(手机没有电池会爆炸吗)

  • my games是什么文件夹(games是什么意思 翻译)

    my games是什么文件夹(games是什么意思 翻译)

  • 宽带连接忘记用户名和密码怎么办(宽带连接忘记用户名)

    宽带连接忘记用户名和密码怎么办(宽带连接忘记用户名)

  • 卡贴机运营商更新可以更新吗(卡贴机运营商能更新吗)

    卡贴机运营商更新可以更新吗(卡贴机运营商能更新吗)

  • word英文每行长短不一(word英文每行长短不一致)

    word英文每行长短不一(word英文每行长短不一致)

  • 超频蓝屏电压不够吗(超频蓝屏开不了机)

    超频蓝屏电压不够吗(超频蓝屏开不了机)

  • 抖音提现失败是怎么回事(抖音提现失败10004)

    抖音提现失败是怎么回事(抖音提现失败10004)

  • 华为gt1和2的区别(华为gt1 gt2对比评测)

    华为gt1和2的区别(华为gt1 gt2对比评测)

  • 华为mate30pro5g声音怎么调(华为mate30pro5g声音键在哪)

    华为mate30pro5g声音怎么调(华为mate30pro5g声音键在哪)

  • tagtl00是华为什么型号手机(华为型号tag-tl00)

    tagtl00是华为什么型号手机(华为型号tag-tl00)

  • ip65与ip67的区别(ip65与ip66的区别)

    ip65与ip67的区别(ip65与ip66的区别)

  • ps修改图片尺寸快捷键(如何用ps修改图片尺寸)

    ps修改图片尺寸快捷键(如何用ps修改图片尺寸)

  • 支付宝怎么进团圆系统(支付宝怎么开团)

    支付宝怎么进团圆系统(支付宝怎么开团)

  • 怎么恢复注销的抖音号(怎么恢复注销的微信号)

    怎么恢复注销的抖音号(怎么恢复注销的微信号)

  • 腾讯视频怎么没有倍速播放(腾讯视频怎么没有声音)

    腾讯视频怎么没有倍速播放(腾讯视频怎么没有声音)

  • 联发科helio g90t相当于骁龙多少(联发科helio g90t相当于麒麟多少)

    联发科helio g90t相当于骁龙多少(联发科helio g90t相当于麒麟多少)

  • 在抖音里怎样联系官方(抖音里怎样联系客服电话)

    在抖音里怎样联系官方(抖音里怎样联系客服电话)

  • 叮咚mini2怎么给电脑当音响(叮咚mini2怎么语音唤醒)

    叮咚mini2怎么给电脑当音响(叮咚mini2怎么语音唤醒)

  • 苹果设置授权在哪里(iphone授权设置)

    苹果设置授权在哪里(iphone授权设置)

  • 手机储存空间怎么变大(手机储存空间怎么切换成内存卡储存)

    手机储存空间怎么变大(手机储存空间怎么切换成内存卡储存)

  • 发票第二年是否可以作废
  • 买二手设备还需要备案吗
  • 商会会费是什么意思
  • 小规模收到房租专票进项做账分录
  • 留抵税额账上比申报表多
  • 车间一般性耗用材料会计分录
  • 个税登记app
  • 跨年度发现的差错
  • 社保扣款上月没扣本月如何做会计处理?
  • 会计中应收账款的英文
  • 业务招待费比例扣除额
  • 劳务派遣公司收取劳务费应开具什么票
  • 小规模开票数量怎么算
  • 发票未能在汇算清缴前取得怎么办?
  • 资产减值损失会影响利润吗
  • 购销企业
  • 如何计算房地产容积率与土地面积
  • 如何区分境内所有银行卡
  • 工程施工开具发票
  • 已经提完折旧的固定资产报废
  • 购买方红字信息表开具流程图
  • 其他应收款需要本月合计吗
  • 个人免征增值税起征点
  • 使用本地账户登录什么意思
  • 房地产企业使用什么准则
  • window10切换win7
  • 没有抵扣的增值税怎么做账
  • Windows10屏幕键盘在哪
  • windows 11预览版
  • PHP:ftp_set_option()的用法_FTP函数
  • 社保退休金计算方法
  • 发票盖章有讲究吗
  • 价税款均未支付
  • php strftime
  • 企业间合作建房且建成后自用
  • php和js 哪个简单
  • 购入固定资产后什么时候开始计提折旧
  • 小规模纳税人收入会计分录
  • vue-axios详细介绍
  • web前端基础是什么
  • vue3环境搭建
  • 期末结转主营业务收入负数
  • java是什么意思
  • 用现金报销差旅费及增值税怎么做账
  • mongodb数据删除
  • 建筑企业预缴
  • mysql数据查询慢
  • 软件产品增值税即征即退
  • 其他综合收益核算的内容及会计处理
  • 大额装修费按几年摊销
  • 如何理解事业单位处罚暂行条例中第十八条的兼职规定
  • 制造费用最终去哪里了啊
  • 电子承兑汇票的承兑人是谁
  • 增加的实收资本印花税
  • 航天金税服务费发票在哪打印
  • 电子发票报销如何处理
  • 工商银行代收是什么意思
  • 进入四大会计师事务所怎么样
  • mysql 性能调优参数
  • 自定义设置微信来电铃声
  • win10 0×0000007b怎么解决
  • efi shell有什么用
  • win10 rs5
  • apt软件
  • e ink launcher
  • linux中安装软件可使用哪些方式
  • linux文件latin1转换为utf
  • win10预览版好吗
  • jquery移动节点的方法
  • bootstrap表单模板
  • jQuery Easyui datagrid连续发送两次请求问题
  • win2000停止服务
  • 充分发挥党员的先锋模范作用,积极
  • javascript怎么弄
  • js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
  • jquery去除class
  • 税务编号是什么 个人
  • 河南热力公司收费标准
  • 郑州市国家税务局地址在哪里
  • 税控机发票打印机怎么用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设