spring_boot搭建websocket服务

创建maven项目

在idea新建普通maven项目

加入相关jar包

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>websocketservertest</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring.boot.version>2.7.18</spring.boot.version>
</properties>

<dependencies>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

</project>

添加测试handler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.springframework.web.socket.TextMessage;  
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyWebSocketHandler extends TextWebSocketHandler {

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("New WebSocket connection established: " + session.getId());
}

@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("Received message: " + message.getPayload());
session.sendMessage(new TextMessage("Hello, you sent: " + message.getPayload()));
}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("WebSocket connection closed: " + session.getId());
}

@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.err.println("WebSocket transport error: " + exception.getMessage());
}
}

添加配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(new MyWebSocketHandler(), "/websocket-endpoint")
.setAllowedOrigins("*"); // 允许跨域
}
}

运行并测试

运行spring boot 项目

搜索引擎搜索 websocket在线测试工具。

https://wstool.js.org/

输入地址:ws://127.0.0.1:8080/websocket-endpoint

发送消息:xxxx 查看是否收到和响应情况

关闭连接测试。

缓冲区设置

如果客户端发送消息太大超过8192字节时提示:

1
WebSocket closing: 1009 / No async message support and buffer too small. Buffer size: [8,192], Message size: [8,200]

在WebSocketConfig 添加:

1
2
3
4
5
6
7
8
9
10
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer()
{
ServletServerContainerFactoryBean bean = new ServletServerContainerFactoryBean();
//文本缓冲区大小
bean.setMaxTextMessageBufferSize(60 * 1024 * 1024);
//字节缓冲区大小
bean.setMaxBinaryMessageBufferSize(60 * 1024 * 1024);
return bean;
}

springcloud gateway中最大帧设置

如果客户端发送消息太大超过65535,后提示:

1
WebSocket closing: 1009 / Max frame length of 65536 has been exceeded.

在spring cloud gateway配置文件中:

1
2
3
4
5
6
spring:
cloud:
gateway:
httpclient:
websocket:
max-frame-payload-length: 2097152 # 2M

spring_boot搭建websocket服务
http://hanqichuan.com/2024/10/10/spring/spring_boot搭建websocket服务/
作者
韩启川
发布于
2024年10月10日
许可协议