websocket消息推送实现
一.服务层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | package com.reyo.websocket; import java.io.IOException; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import org.springframework.web.socket.handler.TextWebSocketHandler; @Configuration @EnableWebSocket public class websocketListener implements WebSocketConfigurer, ServletContextListener{ private ConcurrentLinkedQueue<WebSocketSession> sessions = new ConcurrentLinkedQueue<WebSocketSession>(); private WebSocketHandlerReYo handler; @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { handler = new WebSocketHandlerReYo(); registry.addHandler(handler, "/ws/notifymessage.ws" ); registry.addHandler(handler, "/ws/sockjs/notifymessage.ws" ).withSockJS(); new Thread(handler).start(); } class WebSocketHandlerReYo extends TextWebSocketHandler implements Runnable{ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { super .handleTextMessage(session, message); } @Override public void run() { System.out.println( "等待推送...." ); try { int i = 0 ; for (;;) { synchronized ( this ) { try { Thread.sleep( 3000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (i% 10 == 0 ){ nofity( "消息推送测试......" ); System.out.println( "推送消息了...." ); } else { System.out.println( "本次不推送消息了...." ); } i++; } } catch (IOException e) { e.printStackTrace(); System.out.println( "失败...." ); } } private void nofity(String message) throws IOException { Iterator<WebSocketSession> iterator = sessions.iterator(); while (iterator.hasNext()) { WebSocketSession session = iterator.next(); synchronized (session){ if (session.isOpen()){ session.sendMessage( new TextMessage(message)); } else { iterator.remove(); } } } } } } |
二.前台界面监听
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <!DOCTYPE html> <html> <head> <meta charset= "UTF-8" > <title>Insert title here</title> </head> <body> websocket测试界面 </body> <script type= "text/javascript" > var websocketPath = "localhost:8080/reyo" ; if ( 'WebSocket' in window) { websocket = new WebSocket( "ws://" +websocketPath+ "/ws/notifymessage.ws" ); } else if ( 'MozWebSocket' in window) { websocket = new MozWebSocket( "ws://" +websocketPath+ "/ws/notifymessage.ws" ); } else { websocket = new SockJS( "ws://" +websocketPath+ "/ws/notifymessage.ws" ); } websocket.onopen = function (evnt) { }; websocket.onmessage = function (evnt) { console.log(evnt); }; websocket.onerror = function (evnt) { }; websocket.onclose = function (evnt) { } </script> </html> |
注意web.xml中配置DispatcherServlet控制器
spring-servlet.xml空文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | <servlet> <servlet-name>spring</servlet-name> <servlet- class >org.springframework.web.servlet.DispatcherServlet</servlet- class > <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.ws</url-pattern> </servlet-mapping> |
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
· Windows 提权-UAC 绕过
2014-11-01 Quartz的集群模式和单机模式共存-让一个非集群的Quartz与集群节点并行着运行
2014-11-01 java.util.NoSuchElementException解决办法