当前位置: 首页 > news >正文

黔东南手机网站建设单仁营销网站的建设

黔东南手机网站建设,单仁营销网站的建设,无锡做食品网站的公司哪家好,wordpress contact form 7【2023】前端加springboot实现Web Socket连接通讯#xff08;包括后端实现心跳检测#xff09; 一级目录二级目录三级目录 前言一、Web Socket 简绍1 为什么用 websocket#xff1f; 二、代码实现1、前端#xff08;html#xff09;1.1、无前端向后端发送消息1.2、有前端向… 【2023】前端加springboot实现Web Socket连接通讯包括后端实现心跳检测 一级目录二级目录三级目录 前言一、Web Socket 简绍1 为什么用 websocket 二、代码实现1、前端html1.1、无前端向后端发送消息1.2、有前端向后端发送消息 2、后端具体代码spring boot2.1、maven依赖2.2、配置类3、Web Socket连接工具类2.3、Controller用于测试主动发送消息2.4、定时任务用于调用主动向客户端发送心跳 三、测试1、 测试消息发送1.1、前端日志1.2、后端日志 2、测试客户端异常断开服务器通过心跳检测自动剔除掉异常对话。 一级目录 二级目录 三级目录 前言 写这个项目主要是有有个项目需要后端有数据实话返回前端一开始采用前端轮询的方式后面觉得及时性上有些不行然后改为使用websocket 具体实现demo以及测试流程发出来提供交流学习 一、Web Socket 简绍 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单允许服务端主动向客户端推送数据。在WebSocket API中浏览器和服务器只需要完成一次握手两者之间就直接可以创建持久性的连接并进行双向数据传输。 1 为什么用 websocket 换句话说websocket 解决了什么问题答案是解决了两个主要问题 只能客户端发送请求一段时间内的频繁信息发送 假设现在需要设计一个实时预警系统的通知模块那么作为工程师我们应该怎么设计通知的这个功能呢因为这些系统的数据来源一般他通过硬件设备采集到后台的如果我们现在只有 http 协议那么我们只能让客户端不断地轮询服务器轮询的时间间隔越小越能接近实时的效果。可是轮询的效率低又浪费资源。针对这样的场景websocket 应运而生。 特点: 1建立在 TCP 协议之上服务器端的实现比较容易是一个可靠的传输协议。 2与 HTTP协议有着良好的兼容性。默认端口也是80和443并且握手阶段采用 HTTP 协议因此握手时不容易屏蔽能通过各种 HTTP 代理服务器。 3数据格式比较轻量性能开销小通信高效。 4可以发送文本也可以发送二进制数据。 5没有同源限制客户端可以与任意服务器通信。 6协议标识符是ws如果加密则为wss服务器网址就是 URL。 二、代码实现 1、前端html 1.1、无前端向后端发送消息 uid实际开发中应该使用唯一值作为当前对话的key !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head body 消息展示区:br/ div idtextArea/div/body scriptvar textArea document.getElementById(textArea);var websocket null;//如果浏览器支持websocket就建立一个websocket否则提示浏览器不支持websocket //uid应该要用唯一标识为了测试方便看if(websocket in window){websocketPage new WebSocket(ws://localhost:8080/websocket/ 99);}else{alert(浏览器不支持websocket!);}//建立websocket时自动调用websocketPage.onopen function (event) {console.log(建立连接);}//关闭webscoket时自动调用websocketPage.oncolse function (event){console.log(关闭连接);}//websocket接收到消息时调用websocketPage.onmessage function (event){//将接收到的消息展示在消息展示区 (心跳响应回来的消息不显示)if (event.data ! conn_success){textArea.innerText event.data;textArea.innerHTML br/;}}//websocket出错自动调用websocketPage.onerror function () {alert(websocket出错);}//关闭窗口前关闭websocket连接window.onbeforeunload function (){websocketPage.close();}/script /html1.2、有前端向后端发送消息 !DOCTYPE html htmlheadmeta charsetutf-8titleJava后端WebSocket的Tomcat实现/titlescript typetext/javascript srcjs/jquery.min.js/script/headbodyWelcomebr/input idtext typetext /button onclicksend()发送消息/buttonhr/button onclickcloseWebSocket()关闭WebSocket连接/buttonhr/div idmessage/div/bodyscript typetext/javascriptvar websocket null;//判断当前浏览器是否支持WebSocketif(WebSocket in window) {//改成你的地址websocket new WebSocket(ws://localhost:8080/websocket/100);} else {alert(当前浏览器 Not support websocket)}//连接发生错误的回调方法websocket.onerror function() {setMessageInnerHTML(WebSocket连接发生错误);};//连接成功建立的回调方法websocket.onopen function() {setMessageInnerHTML(WebSocket连接成功);}var U01data, Uidata, Usdata//接收到消息的回调方法websocket.onmessage function(event) {console.log(event);if (event.data ! conn_success){setMessageInnerHTML(接收消息event.data);// setMessageInnerHTML(event);setechart()}}//连接关闭的回调方法websocket.onclose function() {setMessageInnerHTML(WebSocket连接关闭);}// //监听窗口关闭事件当窗口关闭时主动去关闭websocket连接防止连接还没断开就关闭窗口server端会抛异常。window.onbeforeunload function() {closeWebSocket();}//将消息显示在网页上function setMessageInnerHTML(innerHTML) {document.getElementById(message).innerHTML innerHTML br/;}//关闭WebSocket连接function closeWebSocket() {websocket.close();}//发送消息function send() {var message document.getElementById(text).value;websocket.send({msg: message });setMessageInnerHTML(--------------发送消息message );}/script /html2、后端具体代码spring boot 2.1、maven依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId/dependency– yml没有东西只有一个默认端口 2.2、配置类 需要加一个 WebSocket 端点暴露 的bean 和定时器注解 EnableScheduling //定时器 SpringBootApplication public class WebSocketApplication {public static void main(String[] args) {SpringApplication.run(WebSocketApplication.class, args);}/** * 服务器端点导出 * author zhengfuping* date 2023/8/22 * return ServerEndpointExporter */Beanpublic ServerEndpointExporter getServerEndpointExporter(){return new ServerEndpointExporter();} }3、Web Socket连接工具类 Slf4j Service ServerEndpoint(/websocket/{uid}) public class WebSocketServer2 {//连接建立时长private static final long sessionTimeout 60000;// 用来存放每个客户端对应的WebSocketServer对象private static MapString, WebSocketServer2 webSocketMap new ConcurrentHashMap();// 与某个客户端的连接会话需要通过它来给客户端发送数据private Session session;// 接收idprivate String uid;/*** 连接建立成功调用的方法* author zhengfuping* date 2023/8/22* param session* param uid*/OnOpenpublic void onOpen(Session session , PathParam(uid) String uid){session.setMaxIdleTimeout(sessionTimeout);this.session session;this.uid uid;if (webSocketMap.containsKey(uid)){webSocketMap.remove(uid);}webSocketMap.put(uid,this);log.info(websocket连接成功编号uid: uid 当前在线数: getOnlineClients());try{// 响应客户端实际业务数据sendMessage(conn_success);}catch (Exception e){log.error(websocket发送连接成功错误编号uid: uid 网络异常!!!);}}/*** 连接关闭调用的方法* author zhengfuping* date 2023/8/22*/OnClosepublic void onClose(){try {if (webSocketMap.containsKey(uid)){webSocketMap.remove(uid);}log.info(websocket退出编号uid: uid 当前在线数为: getOnlineClients());} catch (Exception e) {log.error(websocket编号uid连接关闭错误: uid 原因: e.getMessage());}}/*** 收到客户端消息后调用的方法* param message 客户端发送过来的消息* param session*/OnMessagepublic void onMessage(String message, Session session) {try {WebSocketServer2.sendInfo(message);log.info(websocket收到客户端编号uid消息: uid , 报文: message);} catch (Exception e) {log.error(websocket发送消息失败编号uid为: uid ,报文: message);}}/*** 发生错误时调用* param session* param error*/OnErrorpublic void onError(Session session, Throwable error) {log.error(websocket编号uid错误: this.uid 原因: error.getMessage());error.printStackTrace();}/*** 实现服务器主动推送* author yingfeng* date 2023/8/22 10:11* Param * param null* return*/public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}/*** 获取客户端在线数* author zhengfuping* date 2023/8/22 10:11* param*/public static synchronized int getOnlineClients() {if (Objects.isNull(webSocketMap)) {return 0;} else {return webSocketMap.size();}}/*** 单机使用外部接口通过指定的客户id向该客户推送消息* param key* param message* return boolean*/public static boolean sendMessageByWayBillId(NotNull String key, String message) {WebSocketServer2 webSocketServer webSocketMap.get(key);if (Objects.nonNull(webSocketServer)) {try {webSocketServer.sendMessage(message);log.info(websocket发送消息编号uid为: key 发送消息: message);return true;} catch (Exception e) {log.error(websocket发送消息失败编号uid为: key 消息: message);return false;}} else {log.error(websocket未连接编号uid号为: key 消息: message);return false;}}/*** 群发自定义消息* author zhengfuping* date 2023/8/22 9:52* param message*/public static void sendInfo(String message) {webSocketMap.forEach((k, v) - {WebSocketServer2 webSocketServer webSocketMap.get(k);try {webSocketServer.sendMessage(message);log.info(websocket群发消息编号uid为: k 消息: message);} catch (IOException e) {log.error(群发自定义消息失败: k message: message);}});}/*** 服务端群发消息-心跳包* author zhengfuping* date 2023/8/22 10:09* param message 推送数据* return int 连接数*/public static synchronized int sendPing(String message){if (webSocketMap.size() 0)return 0;StringBuffer uids new StringBuffer();AtomicInteger count new AtomicInteger();webSocketMap.forEach((uid,server)-{count.getAndIncrement();if (webSocketMap.containsKey(uid)){WebSocketServer2 webSocketServer webSocketMap.get(uid);try {if (Integer.valueOf(uid) 101){Integer i1/0;}webSocketServer.sendMessage(message);if (count.equals(webSocketMap.size() - 1)){uids.append(uid);return;}uids.append(uid).append(,);} catch (Exception e) {webSocketMap.remove(uid);log.info(客户端心跳检测异常移除: uid 心跳发送失败已移除);}}else {log.info(客户端心跳检测异常不存在: uid 不存在);}});log.info(客户端心跳检测结果: uids 连接正在运行);return webSocketMap.size();}/*** 连接是否存在* param uid* return boolean*/public static boolean isConnected(String uid) {if (Objects.nonNull(webSocketMap) webSocketMap.containsKey(uid)) {return true;} else {return false;}} } 2.3、Controller用于测试主动发送消息 RestController RequestMapping(/test) public class WebSocketController{/*** 检验连接* date 2023/8/22* Param * param webSocketId* return * return String*/GetMapping(/webSocketIsConnect/{webSocketId})public String webSocketIsConnect(PathVariable(webSocketId) String webSocketId){if (WebSocketServer2.isConnected(webSocketId)) {return webSocketId正在连接;}return webSocketId连接断开;}/*** 单发 消息* author zhengfuping* date 2023/8/22 10:25* param webSocketId 指定 连接* param message 数据* param pwd 验证密码* return String*/GetMapping(/sendMessageByWayBillId)public String sendMessageByWayBillId(String webSocketId, String message, String pwd) {boolean flag false;flag WebSocketServer2.sendMessageByWayBillId(webSocketId, message);if (flag) {return 发送成功;}return 发送失败;}/*** 群发* author zhengfuping* date 2023/8/22 10:26* param message* param pwd*/GetMapping(/broadSendInfo)public void sendInfo(String message, String pwd) {WebSocketServer2.sendInfo(message);} }2.4、定时任务用于调用主动向客户端发送心跳 每10秒调用一次主动检测查看客户端连接是否异常断开如果异常断开则把该会话从集合中剔除掉避免无限积压。 Component Slf4j public class WebSocketTask {Scheduled(cron 0/10 * * * * ?)public void clearOrders(){int num 0;try {num WebSocketServer2.sendPing(conn_success);} finally {log.info(websocket心跳检测结果共【 num 】个连接);}} } 三、测试 1、 测试消息发送 1.1、前端日志 1.2、后端日志 2、测试客户端异常断开服务器通过心跳检测自动剔除掉异常对话。 因为测试不方便只能通过断点实现效果 前端需要把主动关闭会话的注释掉不让主动关闭 先在连接关闭的地方和心跳检测地方打上断点断点需要设置成Thread要不然没法异步 然后关闭掉一个前端页面让他把会话关闭就会进入该断点位置通过断点让它停住不让他去正常关闭 4. 然后选择执行该心跳检测的断点代码 5. 进入心跳的循环给每个会话发送心跳检测此时前端已经异常断开了 6. 因为前端已经关闭会话了则发送心跳会失败会直接进入catch块然后把该会话从集合中剔除掉 最终日志
文章转载自:
http://www.morning.mpgfk.cn.gov.cn.mpgfk.cn
http://www.morning.knwry.cn.gov.cn.knwry.cn
http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn
http://www.morning.hhboyus.cn.gov.cn.hhboyus.cn
http://www.morning.slfkt.cn.gov.cn.slfkt.cn
http://www.morning.gpsrk.cn.gov.cn.gpsrk.cn
http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn
http://www.morning.pmwhj.cn.gov.cn.pmwhj.cn
http://www.morning.jppb.cn.gov.cn.jppb.cn
http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn
http://www.morning.nbrkt.cn.gov.cn.nbrkt.cn
http://www.morning.nrydm.cn.gov.cn.nrydm.cn
http://www.morning.sbrjj.cn.gov.cn.sbrjj.cn
http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn
http://www.morning.pzqnj.cn.gov.cn.pzqnj.cn
http://www.morning.kphyl.cn.gov.cn.kphyl.cn
http://www.morning.rrrrsr.com.gov.cn.rrrrsr.com
http://www.morning.nbqwr.cn.gov.cn.nbqwr.cn
http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn
http://www.morning.cklld.cn.gov.cn.cklld.cn
http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn
http://www.morning.nfzw.cn.gov.cn.nfzw.cn
http://www.morning.rtlg.cn.gov.cn.rtlg.cn
http://www.morning.nhrkl.cn.gov.cn.nhrkl.cn
http://www.morning.gl-group.cn.gov.cn.gl-group.cn
http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com
http://www.morning.qfqld.cn.gov.cn.qfqld.cn
http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn
http://www.morning.ygkq.cn.gov.cn.ygkq.cn
http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn
http://www.morning.nzmhk.cn.gov.cn.nzmhk.cn
http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn
http://www.morning.xnflx.cn.gov.cn.xnflx.cn
http://www.morning.hrjrt.cn.gov.cn.hrjrt.cn
http://www.morning.qbkw.cn.gov.cn.qbkw.cn
http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn
http://www.morning.jnrry.cn.gov.cn.jnrry.cn
http://www.morning.tplht.cn.gov.cn.tplht.cn
http://www.morning.bhdyr.cn.gov.cn.bhdyr.cn
http://www.morning.fnywn.cn.gov.cn.fnywn.cn
http://www.morning.xfmzk.cn.gov.cn.xfmzk.cn
http://www.morning.drspc.cn.gov.cn.drspc.cn
http://www.morning.nrgdc.cn.gov.cn.nrgdc.cn
http://www.morning.yesidu.com.gov.cn.yesidu.com
http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn
http://www.morning.yzygj.cn.gov.cn.yzygj.cn
http://www.morning.zlrrj.cn.gov.cn.zlrrj.cn
http://www.morning.nbhft.cn.gov.cn.nbhft.cn
http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn
http://www.morning.mfltz.cn.gov.cn.mfltz.cn
http://www.morning.lzrpy.cn.gov.cn.lzrpy.cn
http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn
http://www.morning.dbqcw.com.gov.cn.dbqcw.com
http://www.morning.qnbck.cn.gov.cn.qnbck.cn
http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn
http://www.morning.bpmft.cn.gov.cn.bpmft.cn
http://www.morning.mtktn.cn.gov.cn.mtktn.cn
http://www.morning.rpkl.cn.gov.cn.rpkl.cn
http://www.morning.djwpd.cn.gov.cn.djwpd.cn
http://www.morning.qichetc.com.gov.cn.qichetc.com
http://www.morning.qwbht.cn.gov.cn.qwbht.cn
http://www.morning.gzttoyp.com.gov.cn.gzttoyp.com
http://www.morning.kpgbz.cn.gov.cn.kpgbz.cn
http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn
http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn
http://www.morning.xkjqg.cn.gov.cn.xkjqg.cn
http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn
http://www.morning.wqcz.cn.gov.cn.wqcz.cn
http://www.morning.bzlfw.cn.gov.cn.bzlfw.cn
http://www.morning.rmryl.cn.gov.cn.rmryl.cn
http://www.morning.djpps.cn.gov.cn.djpps.cn
http://www.morning.rntgy.cn.gov.cn.rntgy.cn
http://www.morning.mksny.cn.gov.cn.mksny.cn
http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn
http://www.morning.nfccq.cn.gov.cn.nfccq.cn
http://www.morning.kflpf.cn.gov.cn.kflpf.cn
http://www.morning.znrgq.cn.gov.cn.znrgq.cn
http://www.morning.rpwht.cn.gov.cn.rpwht.cn
http://www.morning.ltrms.cn.gov.cn.ltrms.cn
http://www.morning.xjmyq.com.gov.cn.xjmyq.com
http://www.tj-hxxt.cn/news/246599.html

相关文章:

  • 济南做公司网站网页版微信怎么加好友
  • 上海网站建设心得后台管理系统界面
  • 做家装的有没有网站可以找工作上海装修公司排名哪家好
  • 上海自助建站企业产品推广运营公司
  • python网站开发实战湖州公司做网站
  • 南充网站建设多少钱好的手机网站建设公司
  • 单页网站建设服务好的商家杭州网站建设hzfwwl
  • 网站建设领导小组微机做网站的软件
  • 酒生产企业网站建设的目的深圳做网站哪个公司最好
  • 网站开发人员需求分析网站空间商那个好
  • 柳传志 潘石屹做水果网站砀山做网站的公司
  • 亭湖区建设局网站做网站需要什么备案
  • 免费人才招聘网站网站建设可行性分析报告模板
  • 关于企业网站建设数据现状分析大学做兼职英语作文网站
  • 网站做链接算侵权吗济南网站建设 历山北路
  • 又一个wordpress网站免扣连线矢量图
  • 网站qq临时会话代码wordpress 搜索主题
  • 网站建设需要哪些人员军事时事新闻最新消息
  • 网站建设绩效考评什么网站可以直接做word
  • 美食网站建设规划书演示公司soap公司网站
  • 网站开发必须要做前端吗哈尔滨网站建设工作室
  • 网站登录模版济南网络推广公司排行榜
  • 手机wap网站导航模板广元做网站站排名
  • dw怎么切片做网站深圳做网站980
  • 网站里面的图片做桌面不清晰度做网站考什么赚钱
  • 怎么做网站接口泰安房产信息网官网
  • 建设工程信息发布网站能用的免费proxy网页
  • 苏宁易购网站建设北京南站属于哪个街道
  • 南沙滩网站建设编程培训
  • 佛山网站seo公司单页网站seo怎么做