• Spring Boot之WebSocket


    一、项目说明

    1、项目地址:https://github.com/hqzmss/test01-springboot-websocket.git

    2、IDE:IntelliJ IDEA 2018.1.1 x64

    二、步骤说明

    Spring Boot实现WebSocket比较简单,主要分以下四步:

    1、添加依赖

    1 <dependency>
    2     <groupId>org.springframework.boot</groupId>
    3     <artifactId>spring-boot-starter-websocket</artifactId>
    4 </dependency>

    其他的依赖只涉及到Spring Boot本身的依赖

    2、创建拦截器

    拦截器要实现【HandshakeInterceptor】这个接口,并实现它的两个方法。

    拦截器的主要作用是在WebSocket创建握手之前和之后进行一些相应的处理

     1 package com.hqzmss.websocket_demo1;
     2 
     3 import org.springframework.http.server.ServerHttpRequest;
     4 import org.springframework.http.server.ServerHttpResponse;
     5 import org.springframework.web.socket.WebSocketHandler;
     6 import org.springframework.web.socket.server.HandshakeInterceptor;
     7 
     8 import java.util.Map;
     9 
    10 /**
    11  * 拦截器
    12  */
    13 public class MyWebSocketInterceptor implements HandshakeInterceptor {
    14 
    15     /**
    16      * 握手之前调用
    17      * @param serverHttpRequest 当前请求
    18      * @param serverHttpResponse 当前响应
    19      * @param webSocketHandler 目标处理器
    20      * @param map 请求属性
    21      * @return 是否通过
    22      * @throws Exception 异常信息
    23      */
    24     @Override
    25     public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
    26         System.out.println("连接前进行处理");
    27         return true;
    28     }
    29 
    30     /**
    31      * 握手之后调用
    32      * @param serverHttpRequest 当前请求
    33      * @param serverHttpResponse 当前响应
    34      * @param webSocketHandler 目标处理器
    35      * @param e 握手期间引发的异常,如果没有,则为null
    36      */
    37     @Override
    38     public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
    39         System.out.println("连接后进行处理");
    40     }
    41 }
    42  

    3、创建处理器

    处理器是所有消息的处理中心。

    【afterConnectionEstablished】:这个方法会为每个WebSocket连接创建一个WebSocketSession,标识一个连接。

                  可以将这个WebSocketSession保存起来,以后要是服务器有消息要发送到这个客户端,则通过WebSocketSession直接发送

    【handleMessage】:从客户端发来的消息由此方法接收并做相应处理。消息由WebSocketMessage来接收。

     1 package com.hqzmss.websocket_demo1;
     2 
     3 import org.springframework.web.socket.*;
     4 
     5 /**
     6  * 创建处理器
     7  */
     8 public class MyHandler implements WebSocketHandler  {
     9     /**
    10      * 在WebSocket协商成功后调用,并且打开WebSocket连接准备使用
    11      * @param webSocketSession webSocketSession
    12      * @throws Exception 异常
    13      */
    14     @Override
    15     public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
    16         System.out.println("sessionId=" + webSocketSession.getId());
    17     }
    18 
    19     /**
    20      * 当一个新的WebSocket消息到达时调用
    21      * @param webSocketSession webSocketSession
    22      * @param webSocketMessage webSocketMessage
    23      * @throws Exception 异常
    24      */
    25     @Override
    26     public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
    27         System.out.println(webSocketMessage.getPayload());
    28         System.out.println("有消息到达服务器!");
    29     }
    30 
    31     /**
    32      * 处理来自底层WebSocket消息传输的错误
    33      * @param webSocketSession webSocketSession
    34      * @param throwable 错误
    35      * @throws Exception 异常
    36      */
    37     @Override
    38     public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
    39 
    40     }
    41 
    42     /**
    43      * 在网络套接字连接关闭后或在传输错误发生后调用。
    44      * 尽管从技术上讲,会话可能仍然是开放的,但取决于底层实现,在这一点上发送消息是不鼓励的,而且很可能不会成功。
    45      * @param webSocketSession webSocketSession
    46      * @param closeStatus closeStatus
    47      * @throws Exception 异常
    48      */
    49     @Override
    50     public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
    51         if(webSocketSession.isOpen()) {
    52             webSocketSession.close();
    53         }
    54         System.out.println("安全退出了系统");
    55     }
    56 
    57     /**
    58      * WebSocketHandler是否处理部分消息
    59      * @return 标志
    60      */
    61     @Override
    62     public boolean supportsPartialMessages() {
    63         return false;
    64     }
    65 }

    4、添加配置项目

     1)、要记得添加@EnableWebSocket注解,标识这个配置是WebSocket配置

     2)、"/webSocketServer.action"是自定义的连接点,客户端要通过WebSocket连接此服务器则是通过此连接点

     3)、.setAllowedOrigins("*"),这个方法要加上,不加的话有可能连接会被拦截掉

     1 package com.hqzmss.websocket_demo1;
     2 
     3 import org.springframework.context.annotation.Bean;
     4 import org.springframework.context.annotation.Configuration;
     5 import org.springframework.web.socket.WebSocketHandler;
     6 import org.springframework.web.socket.config.annotation.*;
     7 
     8 @Configuration
     9 @EnableWebSocket
    10 public class WebSocketConfig implements  WebSocketConfigurer {
    11 
    12     @Override
    13     public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
    14         webSocketHandlerRegistry.addHandler(webSocketHandler(), "/webSocketServer.action").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");
    15         webSocketHandlerRegistry.addHandler(webSocketHandler(), "/sockjs/webSocketServer.action")
    16                 .addInterceptors(new MyWebSocketInterceptor()).withSockJS();
    17     }
    18 
    19     @Bean
    20     public WebSocketHandler webSocketHandler() {
    21         return new MyHandler();
    22     }
    23 }
  • 相关阅读:
    Odoo13在Win10(专业版)中的配置
    我在博客园安家了
    2012笔记
    你给我好好发邮件行不行
    事务经典例子
    轻松实现SQL Server与Access、Excel数据表间的导入导出
    SQL大全
    小笔记
    性能优化
    程序中的异常和错误处理
  • 原文地址:https://www.cnblogs.com/hqzmss/p/9095423.html
Copyright © 2020-2023  润新知