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

  • 总额法和净额法会计分录对比
  • 疫情期间生活服务业免征增值税截止时间
  • 累计折旧贷方余额表示
  • 没有发票的房租如何入账
  • 开了发票不做收入的账务处理
  • 单位给员工投保
  • 冲红发票怎么写备注
  • 年报和汇算清缴报表数字不一致
  • 个人向个人借款100万交税吗
  • 本期应纳税额减征额怎么填写
  • 银行网银服务费做什么科目
  • 一般纳税人辅导期
  • 来料加工税务账应采取哪种核算方式?
  • 汇算清缴补交需要调报表吗
  • 现金支付业务
  • 3%税率是一般纳税人还是小规模
  • 通信服务费可以取消吗
  • 不涉及税收
  • 减免税期间是什么意思
  • 增值税专用发票的税率是多少啊
  • 福利费税前扣除标准2023
  • 开票资料填写
  • 免征土地增值税的有哪些
  • 企业亏损需要缴税吗
  • 安装费要交税吗
  • 货物分批付款会计处理
  • 汽车修理费抵扣怎么做账
  • 注册资本多少钱算大公司
  • 汇回投资方的现值怎么算
  • acer笔记本电脑怎么恢复出厂设置
  • win10我的电脑图标不见了怎么恢复原状
  • win10运行红色警戒2卡顿
  • php实现保存网站内容
  • php哪个函数能取得字符串长度
  • 股东向公司借款协议书范本
  • url是什么软件
  • 二手房交易土增税文件
  • 迷迭香怎么养殖方法
  • php网页安全认证是什么
  • 备用金报销怎么做账
  • 小微企业直接融资和间接融资
  • 委托代销商品的会计分录怎么做
  • vue 百度地图 移动端
  • 退教育附加税会计分录
  • 前端框架三大框架
  • 微信小程序开发一个多少钱
  • 独立核算的分公司可以享受小微企业吗
  • 微众银行贷款到期晚2天还
  • 支付给外单位人员的报酬怎么入账
  • 筹建期的财务费用计入
  • 冲红怎么做会计科目
  • 门诊收费票据能重新打印吗
  • 主营业务收入明细科目
  • 定期定额户不能用专票
  • 长期待摊费用做账
  • 个人所得税计算方法2023计算器
  • 什么税能计入税额
  • 偿债基金作用
  • 汇算清缴主要检查什么
  • 本期盈余结转会亏损吗
  • 库存现金是负数怎么调
  • 公司购买垃圾袋纸巾摘要怎么写好
  • mysql innodb缓存
  • MySQL 5.6 (Win7 64位)下载、安装与配置图文教程
  • 新装mysql设置密码
  • windos基于
  • win8激活点不进去
  • win10飞行模式怎么关掉没有图标
  • Win7 64位系统声卡重装过程中出现失败的解决方法
  • 苹果电脑bim
  • 虚拟机里面如何设置网络
  • debian怎么用
  • Win7系统打开蓝牙
  • linux diy
  • JQuery 又谈ajax局部刷新
  • 网页设计中的几种齐方式及其特点
  • javascript中array数组对象的含义及常用方法
  • 安卓快速开发平台
  • 城镇土地使用税的计算公式
  • 粤泰股份公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设