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

系列文章目录

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



前言

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


一、WebSocket

WebSocket 也是一种全双工通信的协议,既允许客户端向服务器主动发送消息,也允许服务器主动向客户端发送消息。在 WebSocket 中,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,进行双向数据传输。

WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,附加信息如图所示:
发起一次WebSocket连接
从请求头可以看到Connection请求升级协议,并附带Sec-WebSocket-Key该WebSocket与服务端通讯的“钥匙”,Sec-WebSocket-Version升级到的版本,Upgrade升级协议格式。
在这里插入图片描述
从响应头可以看到Connection表示请求已升级,Upgrade升级后的协议格式。

二、使用步骤

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 org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
@EnableWebSocket
public class WSConfig  {
    
    
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
    
    
        return new ServerEndpointExporter();
    }
}
编写配置WebSocket服务端实现,发现除了Component注解,其实都来自于tomcat-embed-websocket包。
import org.springframework.stereotype.Component;

import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@Component
@ServerEndpoint("/mq-server/server/{pathId}")
public class WSServer{
    
    

    private Session session;

    @OnOpen
    public void onOpen(@PathParam("pathId") String pathId, Session session) throws IOException {
    
    
        this.session = session;
        //通过{}和@PathParam注解,可以在这个ws连接中动态设置占位符信息
        System.out.println("pathId:" + pathId);
        //可以获取请求的参数,建立可以跟http一样,用?带参数过来,每一个客户端连接都对应一个session
        System.out.println(session.getQueryString());     
    }

    @OnMessage
    public void onMessage(String message) {
    
    
        System.out.println("WebSocket onMessage:" + message);
        System.out.println(session);
    }


}

3.测试结果

1.搜索websocket在线工具
2.输入ws://localhost:8080/mq-server/server/路径?clientId=123123&userName=123&password=123
(端口是springboot配置文件中设置的server.port)
3.点击连接
4.查看控制台输出

二月 25, 2022 10:40:40 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring DispatcherServlet 'dispatcherServlet'
pathId:路径
clientId=123123&userName=123&password=123

三、总结

参考:官方文档
参考:https://www.cnblogs.com/bianzy/p/5822426.html
参考:https://blog.csdn.net/coder_what/article/details/109032940
流程笔记:
(1)核心的注解@ServerEndpoint是来自于Javaee的标准中的注解,但是在springboot项目中内置的tomcat已经对其进行了实现,所以如果是传统的项目就需要单独引入javaee-api的依赖。
(2)创建ServerEndpointExporter的bean对象,这个bean会自动注册使用了@ServerEndpoint注解声明的类。(注意,如果使用独立的servlet容器,而不是直接使用springboot的内置容器,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。)

猜你喜欢

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