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>

 

posted @ 2017-02-13 10:31  tianzhongshan  阅读(1349)  评论(0编辑  收藏  举报