websocket消息推送实现(附代码)

转自解放号社区:http://bbs.jointforce.com/topic/25545


一.服务层
  1. package com.demo.websocket;

  2. import java.io.IOException;
  3. import java.util.Iterator;
  4. import java.util.concurrent.ConcurrentLinkedQueue;

  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.ServletContextListener;

  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.web.socket.CloseStatus;
  9. import org.springframework.web.socket.TextMessage;
  10. import org.springframework.web.socket.WebSocketSession;
  11. import org.springframework.web.socket.config.annotation.EnableWebSocket;
  12. import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
  13. import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
  14. import org.springframework.web.socket.handler.TextWebSocketHandler;

  15. @Configuration
  16. @EnableWebSocket
  17. public class websocketListener implements WebSocketConfigurer, ServletContextListener{
  18.     
  19.     private ConcurrentLinkedQueue<WebSocketSession> sessions  = new ConcurrentLinkedQueue<WebSocketSession>();
  20.     
  21.     private WebSocketHandlerTest handler;
  22.     
  23.     
  24.     @Override
  25.     public void contextDestroyed(ServletContextEvent arg0) {
  26.         // TODO Auto-generated method stub
  27.     }

  28.     @Override
  29.     public void contextInitialized(ServletContextEvent arg0) {
  30.         // TODO Auto-generated method stub
  31.         
  32.     }

  33.     @Override
  34.     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  35.         handler = new WebSocketHandlerTest();
  36.         registry.addHandler(handler, "/ws/notifymessage.ws");
  37.         registry.addHandler(handler, "/ws/sockjs/notifymessage.ws").withSockJS();
  38.         new Thread(handler).start();
  39.     }
  40.     
  41.     class  WebSocketHandlerTest extends TextWebSocketHandler implements Runnable{
  42.         
  43.         @Override
  44.         public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  45.             sessions.remove(session);
  46.         }
  47.         
  48.         @Override
  49.         public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  50.             sessions.add(session);
  51.         }
  52.         
  53.         @Override
  54.         protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  55.             super.handleTextMessage(session, message);
  56.         }

  57.         @Override
  58.         public void run() {
  59.             System.out.println("等待推送....");
  60.             try {
  61.                 int i = 0;
  62.                 for (;;) {
  63.                     synchronized (this) {
  64.                         try {
  65.                             Thread.sleep(3000);
  66.                         } catch (InterruptedException e) {
  67.                             // TODO Auto-generated catch block
  68.                             e.printStackTrace();
  69.                         }
  70.                     }
  71.                     if(i%10==0){
  72.                         nofity("消息推送测试......");
  73.                         System.out.println("推送消息了....");
  74.                     }else{
  75.                         System.out.println("本次不推送消息了....");
  76.                     }
  77.                     i++;
  78.                 }
  79.             } catch (IOException e) {
  80.                 e.printStackTrace();
  81.                 System.out.println("失败....");
  82.             }
  83.         }

  84.         private void nofity(String message) throws IOException {
  85.             Iterator<WebSocketSession> iterator = sessions.iterator();
  86.             while (iterator.hasNext()) {
  87.                 WebSocketSession session = iterator.next();
  88.                 synchronized(session){
  89.                     if(session.isOpen()){
  90.                         session.sendMessage(new TextMessage(message));
  91.                     }else{
  92.                         iterator.remove();
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.         
  98.     }

  99. }
复制代码
二.前台界面监听
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Insert title here</title>
  6. </head>
  7. <body>
  8. websocket测试界面
  9. </body>
  10. <script type="text/javascript">

  11. var websocketPath = "localhost:8080/demo-web";

  12. if ('WebSocket' in window) {
  13.     websocket = new WebSocket("ws://"+websocketPath+"/ws/notifymessage.ws");
  14. } else if ('MozWebSocket' in window) {
  15.     websocket = new MozWebSocket("ws://"+websocketPath+"/ws/notifymessage.ws");
  16. } else {
  17.     websocket = new SockJS("ws://"+websocketPath+"/ws/notifymessage.ws");
  18. }
  19. websocket.onopen = function (evnt) {
  20. };
  21. websocket.onmessage = function (evnt) {
  22.     console.log(evnt);
  23. };
  24. websocket.onerror = function (evnt) {
  25. };
  26. websocket.onclose = function (evnt) {
  27. }
  28. </script>
  29. </html>
复制代码
注意web.xml中配置DispatcherServlet控制器

spring-servlet.xml空文件
  1. <servlet>
  2.         <servlet-name>spring</servlet-name>
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>contextConfigLocation</param-name>
  6.             <param-value>/WEB-INF/spring-servlet.xml</param-value>
  7.         </init-param>
  8.         <load-on-startup>1</load-on-startup>
  9.     </servlet>
  10.     <servlet-mapping>
  11.         <servlet-name>spring</servlet-name>
  12.         <url-pattern>*.ws</url-pattern>
  13.     </servlet-mapping>
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值