(自用)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());

}

相关推荐
Q_Q51100828512 分钟前
python的软件工程与项目管理课程组学习系统
spring boot·python·django·flask·node.js·php·软件工程
2301_793086871 小时前
SpringCloud 02 服务治理 Nacos
java·spring boot·spring cloud
MacroZheng2 小时前
还在用WebSocket实现即时通讯?试试MQTT吧,真香!
java·spring boot·后端
midsummer_woo3 小时前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端
别惹CC4 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
柯南二号5 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
javachen__6 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
IT毕设实战小研13 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
一只爱撸猫的程序猿13 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋14 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat