Spring整合Websocket

来源:互联网 发布:淘宝号怎么看注册时间 编辑:程序博客网 时间:2024/05/20 10:11

工欲善其事,必先利其器

Maven依赖的Spring-websocket的jar

  1. <dependency>  
  2.         <groupId>org.springframework</groupId>  
  3.         <artifactId>spring-websocket</artifactId>  
  4.         <version>4.0.6.RELEASE</version>  
  5.     </dependency>  
  6.     <dependency>  
  7.         <groupId>org.springframework</groupId>  
  8.         <artifactId>spring-messaging</artifactId>  
  9.         <version>4.0.6.RELEASE</version>  
  10.     </dependency>  


spring-websocket核心类是:WebSocketConfig

  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  3.     xmlns:websocket="http://www.springframework.org/schema/websocket"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
  7.         http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">  
  8.   
  9.     <bean id="websocket" class="com.lgy.websocket.SystemWebSocketHandler" />  
  10.   
  11.     <websocket:handlers>  
  12.         <websocket:mapping path="/webSocketServer" handler="websocket" />  
  13.         <websocket:handshake-interceptors>  
  14.             <bean class="com.lgy.interceptor.WebSocketHandshakeInterceptor" />  
  15.         </websocket:handshake-interceptors>  
  16.     </websocket:handlers>  
  17. </beans>  

等价于:
  1. @Configuration  
  2. //@EnableWebMvc//这个标注可以不加,如果有加,要extends WebMvcConfigurerAdapter  
  3. @EnableWebSocket  
  4. public class WebSocketConfig implements WebSocketConfigurer {  
  5.     @Override  
  6.     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
  7.         registry.addHandler(chatMessageHandler(),"/websocket/chatMessageServer.do").addInterceptors(new ChatHandshakeInterceptor());  
  8.         registry.addHandler(chatMessageHandler(), "/sockjs/chatMessageServer.do").addInterceptors(new ChatHandshakeInterceptor()).withSockJS();  
  9.     }  
  10.    
  11.     @Bean  
  12.     public TextWebSocketHandler chatMessageHandler(){  
  13.         return new ChatMessageHandler();  
  14.     }  
  15.   
  16. }  
       *若用了第三种方式需要在SpingMVC配置文件中进行包扫描:
  1. <!-- websocket相关扫描,主要扫描:WebSocketConfig.java 这个类路径 -->  
  2.     <context:component-scan base-package="com.lgy.websocket"/>  
  3.     <mvc:annotation-driven/>  


在此我学会了@Configuration和@Bean注解的意义:

@Configuration的意义在于:项目启动的时候Spring会初始化该类,能被Spring加载到它的工程中

@Bean的意义在于通过new 出来的实例对象被Spring来进行管理


a.由核心配置文件带来的第二个类就是拦截器:

  1. package com.lgy.interceptor;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.http.server.ServerHttpRequest;  
  6. import org.springframework.http.server.ServerHttpResponse;  
  7. import org.springframework.stereotype.Repository;  
  8. import org.springframework.web.socket.WebSocketHandler;  
  9. import org.springframework.web.socket.server.HandshakeInterceptor;  
  10. import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;  
  11. @Repository  
  12. public class WebSocketHandshakeInterceptor extends HttpSessionHandshakeInterceptor {  
  13.   
  14.     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,  
  15.             Map<String, Object> attributes) throws Exception {  
  16.         System.out.println("握手之前····");  
  17.         return super.beforeHandshake(request, response, wsHandler, attributes);  
  18.     }  
  19.   
  20.     public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,  
  21.             Exception exception) {  
  22.         System.out.println("握手之后····");  
  23.         super.afterHandshake(request, response, wsHandler, exception);  
  24.     }  
  25.    
  26. }  

     在每次建立长连接的时候,都会进行2次握手,握手成功后方建立连接。


b.这个处理类和客户端差不多,服务端建立连接,断开连接,接受消息,发送消息

  1. package com.lgy.websocket;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Set;  
  5. import java.util.concurrent.CopyOnWriteArraySet;  
  6. import java.util.logging.Logger;  
  7.   
  8. import org.springframework.stereotype.Repository;  
  9. import org.springframework.web.socket.CloseStatus;  
  10. import org.springframework.web.socket.TextMessage;  
  11. import org.springframework.web.socket.WebSocketHandler;  
  12. import org.springframework.web.socket.WebSocketMessage;  
  13. import org.springframework.web.socket.WebSocketSession;  
  14. import org.springframework.web.socket.handler.TextWebSocketHandler;  
  15.   
  16. public class SystemWebSocketHandler extends TextWebSocketHandler {  
  17.     private static final Logger logger;  
  18.     private static final Set<WebSocketSession> connections;  
  19.   
  20.     static {  
  21.         logger = Logger.getLogger(SystemWebSocketHandler.class.getName());  
  22.         connections = new CopyOnWriteArraySet<WebSocketSession>();  
  23.     }  
  24.   
  25.     /**  
  26.      * 接受消息  
  27.      */  
  28.     @Override  
  29.     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {  
  30.         System.out.println("handleTextMessage");  
  31.         session.sendMessage(message);  
  32.     }  
  33.   
  34.     /**  
  35.      * 连接成功时候,会触发UI上onopen方法  
  36.      */  
  37.     @Override  
  38.     public void afterConnectionEstablished(WebSocketSession session) throws Exception {  
  39.         System.out.println("connect to the websocket success......");  
  40.         connections.add(session);  
  41.         // 这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户  
  42.         TextMessage returnMessage = new TextMessage("你大爷");  
  43.         SystemWebSocketHandler.sendMessageToUsers(returnMessage);  
  44.     }  
  45.       
  46.     /**  
  47.      * 用户关闭连接时候  
  48.      */  
  49.     @Override  
  50.     public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {  
  51.         logger.info("websocket connection closed......");  
  52.         connections.remove(session);  
  53.     }  
  54.   
  55.     /**  
  56.      * 给所有在线用户发送消息  
  57.      *  
  58.      * @param message  
  59.      */  
  60.     public static void sendMessageToUsers(TextMessage message) {  
  61.         for (WebSocketSession user : connections) {  
  62.             try {  
  63.                 if (user.isOpen()) {  
  64.                     user.sendMessage(message);  
  65.                 }  
  66.             } catch (IOException e) {  
  67.                 e.printStackTrace();  
  68.             }  
  69.         }  
  70.     }  
  71. }  


整合差不多结束了!

web.xml

  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.     <display-name>Archetype Created Web Application</display-name>  
  7.     <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>  
  10.                 classpath*:websocket/spring-websocket.xml   
  11.         </param-value>  
  12.     </context-param>  
  13.     <listener>  
  14.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  15.     </listener>  
  16.     <servlet>  
  17.         <servlet-name>springMVC</servlet-name>  
  18.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  19.         <init-param>  
  20.             <param-name>contextConfigLocation</param-name>  
  21.             <param-value>classpath:springmvc/spring-mvc.xml</param-value>  
  22.         </init-param>  
  23.     </servlet>  
  24.     <servlet-mapping>  
  25.         <servlet-name>springMVC</servlet-name>  
  26.         <url-pattern>/</url-pattern>  
  27.     </servlet-mapping>  
  28.   
  29. </web-app>  

springMVC
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xsi:schemaLocation="  
  7.        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
  9.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd  
  10.        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">  
  11.     <!-- 启动SpringMVC Controller的注解功能,完成请求和注解POJO的映射 -->  
  12.     <context:component-scan base-package="com.lgy.controller" />  
  13.       
  14.   
  15.   
  16.     <!-- 静态资源映射 -->  
  17.     <mvc:resources mapping="/js/**" location="/js/" />  
  18.   
  19.     <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->  
  20.     <bean id="defaultViewResolver"  
  21.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  22.         <property name="viewClass"  
  23.             value="org.springframework.web.servlet.view.JstlView" />  
  24.         <property name="prefix" value="/WEB-INF/jsp/" />  
  25.         <property name="suffix" value=".jsp" />  
  26.     </bean>  
  27. </beans>  

源码下载地址:https://git.oschina.net/fengchao111/spring-websocket

在网上找了很多demo,都是差不多的,但是很感谢这两个贴主:

http://blog.csdn.net/yxb19870428vv/article/details/41495543

http://www.myexception.cn/web/1775480.html
原创粉丝点击