(自用)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 一个注解搞定「加密 + 解密 + 签名 + 验签」
java·spring boot
ruleslol1 小时前
Spring Boot05-热部署
spring boot
谢平康12 小时前
支持不限制大小,大文件分段批量上传功能(不受nginx /apache 上传大小限制)
java·vue.js·spring boot
congvee14 小时前
springboot学习第5期 - spring data jpa
spring boot
DanB2414 小时前
Spring-boot实战demo
spring boot
灵犀学长15 小时前
Spring Boot Jackson 序列化常用配置详解
java·spring boot·后端
midsummer_woo17 小时前
基于springboot+vue+mysql智能推荐的卫生健康系统(源码+论文+开题报告)
vue.js·spring boot·mysql
天天进步201517 小时前
Spring Boot 3.0新特性全面解析与实战应用
spring boot
余很多之很多18 小时前
基于 Spring Boot、Spring Cloud、Nacos 的微服务架构,在性能测试下的层层优化
spring boot·spring cloud·架构
CodeWolf19 小时前
SpringBoot自动化配置原理
spring boot·spring