企业网站如何做推广,在线阅读 wordpress主题,河北建基官网,深圳品牌设计公司有哪些websocket 协议是在 http 协议上的一种补充协议#xff0c;是 html5 的新特性#xff0c;是一种持久化的协议。其实 websocket 和 http 关系并不是很大#xff0c;不过都是属于应用层的协议#xff0c;接下来我们就开始实战。
websocket 定时推送
本教程基于 springboot …websocket 协议是在 http 协议上的一种补充协议是 html5 的新特性是一种持久化的协议。其实 websocket 和 http 关系并不是很大不过都是属于应用层的协议接下来我们就开始实战。
websocket 定时推送
本教程基于 springboot 为脚手架没使用过 springboot 同学可以看往期文章或者直接去 spring 官网拉一个 springboot 基础项目下来。
加入依赖
在 springboot 的项目中添加一下 webSocket 依赖一般一项新技术的引入在 springboot 中也只是引用一个此技术 starter 的依赖其他配置基本 springboot 帮我们解决了。 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency
配置
新建一个 Java 配置类注入 ServerEndpointExporter 配置如果是使用 springboot 内置的 tomcat 此配置必须如果是使用的是外部 tomcat 容器此步骤请忽略。看 spring 源码中这样描述使用此配置可以关闭 servlet 容器对 websocket 端点的扫描这个暂时没有深入研究。 Configuration public class WebSocketConfig { Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
核心代码
接下来最核心的类其实就是提供一个前后端交互的类实现消息的接收推送。 ServerEndpoint(value /wsdemo) 前端通过此 URI 和后端交互建立连接 Component 不用说将此类交给 spring 管理 OnOpen websocket 建立连接的注解前端触发上面 URI 时会进入此注解标注的方法和之前关于 DWR 文章中的 onpage 方法类似 OnClose 顾名思义关闭连接销毁 session OnMessage 收到前端传来的消息后执行的方法 ServerEndpoint(value /wsdemo) Component public class MyWebSocket { private static int onlineCount 0; private static CopyOnWriteArraySetMyWebSocket webSocketSet new CopyOnWriteArraySetMyWebSocket(); private Session session; OnOpen public void onOpen(Session session) { this.session session; webSocketSet.add(this); addOnlineCount(); System.out.println(有新连接加入当前在线人数为 getOnlineCount()); try { sendMessage(连接已建立成功.); } catch (Exception e) { System.out.println(IO异常); } } OnClose public void onClose() { webSocketSet.remove(this); subOnlineCount(); System.out.println(有一连接关闭当前在线人数为 getOnlineCount()); } OnMessage public void onMessage(String message, Session session) { System.out.println(来自客户端的消息: message); } OnError public void onError(Session session, Throwable error) { System.out.println(发生错误); error.printStackTrace(); } public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { MyWebSocket.onlineCount; } public static synchronized void subOnlineCount() { MyWebSocket.onlineCount--; } public Session getSession() { return session; } public void setSession(Session session) { this.session session; } public static CopyOnWriteArraySetMyWebSocket getWebSocketSet() { return webSocketSet; } public static void setWebSocketSet(CopyOnWriteArraySetMyWebSocket webSocketSet) { MyWebSocket.webSocketSet webSocketSet; } }
定时任务
使用 spring 的 Schedule 建立定时任务 EnableScheduling 开启 spring 定时任务功能 Scheduled(cron 0/10 * * * * ?) 用于标识定时执行的方法此处主要方法返回值一定是 void没有入参。对应定时时间配置可以百度 cron 语法根据自己的业务选择合适的周期 在这类中我们通过上面 MyWebSocket 提供的静态方法获取其中的 webSocketSet 来获取所有此业务相关的所有 websocketsession可以在定时任务中对 session 内容进行验证判断权限验证等进行发送消息 Component EnableScheduling public class TimeTask { private static Logger logger LoggerFactory.getLogger(TimeTask.class); Scheduled(cron 0/1 * * * * ?) public void test(){ System.err.println(********* 定时任务执行 **************); CopyOnWriteArraySetMyWebSocket webSocketSet MyWebSocket.getWebSocketSet(); int i 0 ; webSocketSet.forEach(c-{ try { c.sendMessage( 定时发送 new Date().toLocaleString()); } catch (IOException e) { e.printStackTrace(); } }); System.err.println(/n 定时任务完成.......); } }
前端页面
前端页面可以参考使用主要要更改调用的 url 为自己项目 URL !DOCTYPE HTML html head titleMy WebSocket/title /head body Welcomebr/ input typetext /button onclicksend()Send/button button onclickcloseWebSocket()Close/button div /div /body script typetext/javascript var websocket null; //判断当前浏览器是否支持WebSocket ,主要此处要更换为自己的地址 if(WebSocket in window){ websocket new WebSocket(ws://localhost:8886/wsdemo); } else{ alert(Not support websocket) } //连接发生错误的回调方法 websocket.onerror function(){ setMessageInnerHTML(error); }; //连接成功建立的回调方法 websocket.onopen function(event){ setMessageInnerHTML(open); } //接收到消息的回调方法 websocket.onmessage function(event){ setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose function(){ setMessageInnerHTML(close); } //监听窗口关闭事件当窗口关闭时主动去关闭websocket连接防止连接还没断开就关闭窗口server端会抛异常。 window.onbeforeunload function(){ websocket.close(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML){ document.getElementById(message).innerHTML innerHTML br/; } //关闭连接 function closeWebSocket(){ websocket.close(); } //发送消息 function send(){ var message document.getElementById(text).value; websocket.send(message); } /script /html
效果演示 最后说一句(求关注!别白嫖)
如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。
关注公众号woniuxgg在公众号中回复笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利