转自解放号社区:http://bbs.jointforce.com/topic/25545
- 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>
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>