• websocket消息推送实现


    一.服务层

      

    package com.demo.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 WebSocketHandlerTest 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 WebSocketHandlerTest();
            registry.addHandler(handler, "/ws/notifymessage.ws");
            registry.addHandler(handler, "/ws/sockjs/notifymessage.ws").withSockJS();
            new Thread(handler).start();
        }
        
        class  WebSocketHandlerTest 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();
                        }
                    }
                }
            }
            
        }
    
    }

    二.前台界面监听

      

    <!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/demo-web";
    
    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空文件
    <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>
  • 相关阅读:
    深入浅出HTTP请求(转自http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html)
    IOS定位
    webView(简单的浏览器)
    Get&Post登录
    IOS多媒体
    IOS VFL屏幕自适应
    IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较
    单例设计的定义
    动画
    多线程
  • 原文地址:https://www.cnblogs.com/tianzhongshan/p/6392752.html
Copyright © 2020-2023  润新知