WebSocket(二):完全基于Spring Boot项目的WebSocket服务端

系列文章目录

WebSocket(一):基于Spring Boot项目配合H5标准的WebSocket服务端
WebSocket(二):完全基于Spring Boot项目的WebSocket服务端


@[TOC](文章目录)

前言

此系列文章为记录使用WebSocket的相关过程,如有错误的地方,还请指正。


一、使用步骤

springboot整合的WebSocket服务功能更加强大

1.引入库

<!--spring boot starter websocket已经包含了此依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.编写Spring Boot启动入口

注意:因为我的WebSocket在其他的maven module模块,所以我这里才加了@SpringBootApplication的扫描包路径,所以WebSocket的实现如果是在@SpringBootApplication类的同包或子包下,就不用加扫描,Spring Boot默认扫描自身的包及子包路径。
@SpringBootApplication(scanBasePackages = "cn.test.websocket")
public class MainApp {
    
    
  public static void main(String[] args) {
    
    
    SpringApplication.run(MainApp.class);
    }

2.编写WebSocket服务端

编写配置WebSocket配置类
import com.mediacomm.skylink.web.handler.SpringWebSocketHandler;
import com.mediacomm.skylink.web.interceptor.SpringWebSocketHandlerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    
    
        registry.addHandler(getSpringWebSocketHandler(), "/mq-server/server")
                .addInterceptors(getInterceptor()).setAllowedOrigins("*");
        
    }

    @Bean
    public SpringWebSocketHandler getSpringWebSocketHandler() {
    
    
        return new SpringWebSocketHandler();
    }

    @Bean
    public SpringWebSocketHandlerInterceptor getInterceptor() {
    
    
        return new SpringWebSocketHandlerInterceptor();
    }

}
编写消息处理器
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class SpringWebSocketHandler extends TextWebSocketHandler {
    
    
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
    
    
        System.out.println("建立websocket连接" +  session);
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
    
    
        System.out.println("接收到客户端消息:" + message);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
    
    
        System.out.println("连接断开");
    }
}

编写拦截器

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import java.util.Map;

public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
    
    
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes){
    
    
    	//这里拦截的是请求升级websocket的http
        System.out.println("拦截请求:前");
        //返回true就会建立连接,false则反之
        //所以可以在这里设置http请求的参数的用户名和密码
        ///然后通过request.getURI(),用字符串分割后获取参数
        //如果要把参数往下传递给SpringWebSocketHandler,可以将参数放入attributes域中
        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
    
    
        System.out.println("拦截请求:后");
    }
}

三、总结

参考:官方文档

猜你喜欢

转载自blog.csdn.net/weixin_42717117/article/details/123132795