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

  • 苹果手机26键中文输入法怎么设置(苹果手机26键中文输入法没了怎么弄)

    苹果手机26键中文输入法怎么设置(苹果手机26键中文输入法没了怎么弄)

  • 华为荣耀9x指纹解锁在什么位置(华为荣耀9x指纹在哪里)

    华为荣耀9x指纹解锁在什么位置(华为荣耀9x指纹在哪里)

  • 学信网密保问题顺序有要求吗(学信网密保问题设置错误是什么意思)

    学信网密保问题顺序有要求吗(学信网密保问题设置错误是什么意思)

  • word复制表格保留原格式怎么办(word复制表格保留源格式为什么还是会变)

    word复制表格保留原格式怎么办(word复制表格保留源格式为什么还是会变)

  • 畅联语音是什么东西(畅联语音是什么功能)

    畅联语音是什么东西(畅联语音是什么功能)

  • 虚拟机硬盘设大了可以调小吗(虚拟机硬盘内存设置多大合适)

    虚拟机硬盘设大了可以调小吗(虚拟机硬盘内存设置多大合适)

  • 黄钻过期后自定义的空间背景会消失吗(黄钻过期了还能置顶吗)

    黄钻过期后自定义的空间背景会消失吗(黄钻过期了还能置顶吗)

  • 电脑com端口不显示(com端口不见了)

    电脑com端口不显示(com端口不见了)

  • word2007页码怎么设置(word2007页码怎么设置不了)

    word2007页码怎么设置(word2007页码怎么设置不了)

  • 5g手机可以用4g的手机卡速度会快吗(5G手机可以用4G流量吗)

    5g手机可以用4g的手机卡速度会快吗(5G手机可以用4G流量吗)

  • 文件不支持本地查看怎么办(文件不支持本地查看,请用其他应用打开)

    文件不支持本地查看怎么办(文件不支持本地查看,请用其他应用打开)

  • 小米8青春版有月亮模式吗(小米8青春版有快充吗)

    小米8青春版有月亮模式吗(小米8青春版有快充吗)

  • 微信登录不上怎么办(微信登录不上怎么办手机号换了)

    微信登录不上怎么办(微信登录不上怎么办手机号换了)

  • 华为mate30要贴膜吗(华为mate30贴膜后无法截屏)

    华为mate30要贴膜吗(华为mate30贴膜后无法截屏)

  • 苹果手机能扩容内存吗(苹果手机能扩容内存多少钱)

    苹果手机能扩容内存吗(苹果手机能扩容内存多少钱)

  • 大众点评d币在哪里(大众点评金币怎么获得)

    大众点评d币在哪里(大众点评金币怎么获得)

  • 手机美图秀秀怎么换照片底色(手机美图秀秀怎么只美白一个人)

    手机美图秀秀怎么换照片底色(手机美图秀秀怎么只美白一个人)

  • 后悔升级了ios13怎么降(升级ios 13)

    后悔升级了ios13怎么降(升级ios 13)

  • 苹果11屏幕尺寸(苹果11屏幕尺寸是多少)

    苹果11屏幕尺寸(苹果11屏幕尺寸是多少)

  • 微信收不了红包怎么回事(不添加银行卡微信收不了红包)

    微信收不了红包怎么回事(不添加银行卡微信收不了红包)

  • 携程砍价返现在哪领取(携程砍价返现在哪里)

    携程砍价返现在哪领取(携程砍价返现在哪里)

  • 苹果无线耳机设置在哪(苹果无线耳机设置)

    苹果无线耳机设置在哪(苹果无线耳机设置)

  • qq音乐如何取消自动续费(qq音乐如何取消续费会员自动续费)

    qq音乐如何取消自动续费(qq音乐如何取消续费会员自动续费)

  • 教你怎么制作exe程序可执行文件(教你怎么制作微信表情)

    教你怎么制作exe程序可执行文件(教你怎么制作微信表情)

  • 苹果macOS 11 Big Sur适用哪此机型 苹果macOSBigSur升级机型汇总(苹果客服人工24小时)

    苹果macOS 11 Big Sur适用哪此机型 苹果macOSBigSur升级机型汇总(苹果客服人工24小时)

  • ltdmgr.exe是什么进程 有什么作用 ltdmgr进程查询(msgdlg.exe是什么意思)

    ltdmgr.exe是什么进程 有什么作用 ltdmgr进程查询(msgdlg.exe是什么意思)

  • 递延所得税资产和负债怎么计算
  • 交易性金融资产的交易费用计入哪里
  • 百旺购货方红字信息表怎么开具
  • 销售返利的会计科目
  • 其他业务利润包括哪些科目
  • 对公账户卡号是私人账号
  • 自建的固定资产可以抵扣吗
  • 开出增值税发票没收到怎么抵扣进项税?
  • 税控系统技术维护费
  • 公司购买的商品给别的企业用了,企业所得税能列支吗
  • 年底员工聚餐
  • 住宿专票怎么入账
  • 垃圾清运属于什么大类
  • 电子承兑转让怎么撤销
  • 最新早上好图片大全集
  • 事业单位服务收入怎么做账
  • 股东个人财产转让流程
  • deepin咋样
  • 分公司与总公司的关系
  • 笔记本保养技巧和方法
  • 怎么租一个月
  • 注销后怎么补缴社保
  • laravel sqlserver
  • 出口免抵增值税是什么意思
  • python进行傅立叶变换
  • curl error6
  • 购买软件多大金额算违法
  • 发票作废发票怎么处理
  • vue实例完整项目源码
  • vscode怎么写前端代码
  • 经典动画动漫
  • 基于Java+SpringBoot+vue+elementui药品商城采购系统详细设计实现
  • 单位购买电水壶会计入账
  • 职工食堂费用计入什么科目
  • 经营租赁出租方的会计处理
  • 现金流量表期初现金余额怎么计算
  • 企业盘盈的固定资产其核算的会计科目是
  • 历史成本和重置成本的区别
  • 增值税增量留抵退税政策2019
  • 公司当月没有人发工资
  • mongodb从入门到商业实战
  • 政府补贴流程
  • 进项税额有留底税额吗
  • sqlserver触发器在哪个位置
  • 小规模纳税人缴纳增值税的会计科目
  • 股权转让实缴资本4000万如何缴纳
  • 营业执照变更法人需要本人去吗
  • 增值税发票内容填写不全应如何进行处理?
  • 购买方如何申请红字信息表填写负数吗
  • 长期待摊费用待抵扣税金
  • 固定资产支付的保险费计入成本吗
  • 企业营改增税率是多少
  • 加油的增值税发票几个点
  • 未交增值税增加记哪方
  • 怎么用两台电脑登录同一个微信
  • 首先要知道什么英语
  • 电子口岸登录显示证书错误
  • 对公支付宝可以转个人银行卡吗
  • 核定征收需要带什么资料
  • 操作系统中的三级调度
  • win7系统突然退化
  • 最新版日历
  • ubuntu 怎么用
  • gh-files是什么
  • win1020h2版本千万别更新
  • 查看linux的命令
  • win10远程桌面连接教程
  • android按钮点击效果的实验报告
  • 纯css实现轮播图
  • 批处理模式的例子
  • easyui combobox设置值
  • 对xmlHttp对象的理解
  • 安卓绘制图表
  • unity networking
  • 重庆电子税务局怎么开电子发票
  • 即征即退什么时候确认收入
  • 残疾人贷款买房
  • 财产保险合同的种类
  • 境内银行境外贷款
  • 陕西地税局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设