(自用)WebSocket创建流程

在Spring Boot项目中新建WebSocket服务,可以按照以下详细步骤进行操作:

1.创建Spring Boot项目

可以通过Spring Initializr(<>)快速创建一个新的Spring Boot项目,添加`Spring Web`和`Spring Boot DevTools`依赖,也可以添加`Lombok`依赖来简化代码。

2.添加WebSocket依赖

在`pom.xml`文件中添加Spring Boot WebSocket相关依赖:

```xml

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-websocket</artifactId>

</dependency>

```

3.配置WebSocket

创建一个配置类来启用WebSocket支持,并定义处理器和拦截器:

```java

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;

import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

@Configuration

@EnableWebSocket

public class WebSocketConfig implements WebSocketConfigurer {

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

registry.addHandler(myHandler(), "/ws").setAllowedOrigins("*");

}

@Bean

public MyWebSocketHandler myHandler() {

return new MyWebSocketHandler();

}

@Bean

public ServletServerContainerFactoryBean createWebSocketContainer() {

ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();

container.setMaxTextMessageBufferSize(8192);

container.setMaxBinaryMessageBufferSize(8192);

return container;

}

}

```

在上述代码中:

• `registerWebSocketHandlers`方法用于注册WebSocket处理器`MyWebSocketHandler`,并指定WebSocket连接的路径为`/ws`,同时允许所有来源的连接(`setAllowedOrigins("*")`)。

• `myHandler`方法返回一个`MyWebSocketHandler`实例,该实例是自定义的WebSocket处理器,用于处理WebSocket连接中的各种事件。

• `createWebSocketContainer`方法用于配置WebSocket容器的一些参数,如最大文本消息缓冲区大小和最大二进制消息缓冲区大小。

4.创建WebSocket处理器

创建`MyWebSocketHandler`类,继承`TextWebSocketHandler`或`WebSocketHandler`,并重写相应方法来处理WebSocket事件:

```java

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 {

super.afterConnectionEstablished(session);

System.out.println("连接建立:" + session.getId());

}

@Override

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

super.handleTextMessage(session, message);

System.out.println("收到消息:" + message.getPayload());

session.sendMessage(new TextMessage("服务器已收到消息:" + message.getPayload()));

}

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

super.afterConnectionClosed(session, status);

System.out.println("连接关闭:" + session.getId());

}

}

```

在上述代码中:

• `afterConnectionEstablished`方法在WebSocket连接建立后被调用,可以在这里进行一些初始化操作,如打印连接ID。

• `handleTextMessage`方法用于处理客户端发送的文本消息,可以在这里对消息进行处理,并向客户端发送响应。

• `afterConnectionClosed`方法在WebSocket连接关闭后被调用,可以在这里进行一些清理操作,如打印连接关闭信息。

5.创建控制器(可选)

如果需要通过HTTP接口触发WebSocket消息发送,可以创建一个控制器:

```java

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.messaging.simp.SimpMessagingTemplate;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class WebSocketController {

@Autowired

private SimpMessagingTemplate template;

@GetMapping("/send")

public String send(@RequestParam String message) {

template.convertAndSend("/topic/messages", message);

return "消息已发送";

}

}

```

在上述代码中:

• `SimpMessagingTemplate`用于向指定的WebSocket订阅路径发送消息。

• `send`方法通过`@GetMapping`注解定义了一个HTTP GET接口`/send`,当访问该接口时,会将请求参数`message`作为消息发送到WebSocket订阅路径`/topic/messages`。

6.前端页面测试

创建一个简单的HTML页面来测试WebSocket连接和消息发送:

```html

<!DOCTYPE html>

<html>

<head>

<title>WebSocket Test</title>

<script>

var ws = new WebSocket("ws://localhost:8080/ws");

ws.onopen = function () {

console.log("连接已建立");

};

ws.onmessage = function (event) {

console.log("收到消息:" + event.data);

};

ws.onclose = function () {

console.log("连接已关闭");

};

function sendMessage() {

var message = document.getElementById("message").value;

ws.send(message);

}

</script>

</head>

<body>

<h1>WebSocket Test</h1>

<input type="text" id="message" placeholder="输入消息">

<button οnclick="sendMessage()">发送消息</button>

</body>

</html>

定时器

(定时器)主要使用 @Scheduled 注解

启用定时任务支持 在Spring Boot的主类或配置类上添加 @EnableScheduling 注解,以启用定时任务支持:java复制import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableScheduling

public class ScheduledTaskApplication {

public static void run(String[] args) {

SpringApplication.run(ScheduledTaskApplication.class, args);

}

}

  1. 定义定时任务 创建一个类,使用 @Scheduled 注解标记需要定时执行的方法。可以指定任务的执行周期(如固定延迟、固定频率或Cron表达式):java复制import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

@Component

public class MyScheduledTasks {

// 每5秒执行一次

@Scheduled(fixedRate = 5000)

public void fixedRateTask() {

System.out.println("Fixed Rate Task executed at: " + new java.util.Date());

}

相关推荐
悟空码字1 天前
Spring Boot 整合 MongoDB 最佳实践:CRUD、分页、事务、索引全覆盖
java·spring boot·后端
皮皮林5513 天前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
用户908324602735 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840826 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解6 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解6 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记6 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者7 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840827 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解7 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端