博客> websocket消息推送实现(附代码)
websocket消息推送实现(附代码)
2019-07-18 06:59 评论:0 阅读:664 JF阿尔法
app 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==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> [removed]

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) { } [removed] </html> 复制代码 注意web.xml中配置DispatcherServlet控制器

spring-servlet.xml空文件

spring org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring-servlet.xml 1
<servlet>
    <servlet>spring</servlet>
    <url>*.ws</url>
</servlet>

复制代码

收藏
0
sina weixin mail 回到顶部