系列文章目录
WebSocket(一):基于Spring Boot项目配合H5标准的WebSocket服务端 WebSocket(二):完全基于Spring Boot项目的WebSocket服务端
前言
此系列文章为记录使用WebSocket的相关过程,如有错误的地方,还请指正。
一、WebSocket
WebSocket 也是一种全双工通信的协议,既允许客户端向服务器主动发送消息,也允许服务器主动向客户端发送消息。在 WebSocket 中,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,进行双向数据传输。
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,附加信息如图所示: 从请求头可以看到Connection请求升级协议,并附带Sec-WebSocket-Key该WebSocket与服务端通讯的“钥匙”,Sec-WebSocket-Version升级到的版本,Upgrade升级协议格式。 从响应头可以看到Connection表示请求已升级,Upgrade升级后的协议格式。
二、使用步骤
1.引入库
<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;
System.out.println("pathId:" + pathId);
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,因为它将由容器自己提供和管理。)
|