(自用)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);
    }
}
2. 定义定时任务  创建一个类,使用 @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());
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery初步学习

文章目录 一、前言二、概述2.1 介绍2.2 安装 三、语法3.1 文档就绪3.2 选择器 四、事件4.1 概述4.2 事件绑定/解绑4.3 一次性事件4.4 事件委托4.5 自定义事件 五、效果5.1 隐藏/显示5.2 淡入淡出5.3 滑动5.4 动画 六、链七、HTML7.1 内容/属性7.2 元素操作7.3 类属性7.4 样式属…

module错误集合

Library projects cannot set applicationId. applicationId is set to com.example.mylogin in default 在导入一个项目时&#xff0c;提示“Error:Library projects cannot set applicationId. applicationId is set to ‘com.xxx.yyy’ in default config.”&#xff0c;显…

Spring Cloud 通用相关组件详解

前言 Spring Cloud 是一个基于 Spring Boot 的微服务开发框架&#xff0c;它为开发者提供了一套完整的工具和组件&#xff0c;用于快速构建分布式系统中的常见模式&#xff08;如服务注册与发现、负载均衡、配置管理等&#xff09;。本文将详细介绍 Spring Cloud 的通用组件&a…

BUUCTF-web刷题篇(19)

28.CheckIn 源码&#xff1a; #index.php <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…

如何在Android系统上单编ko?

文章目录 一、先了解编译驱动需要什么&#xff1f;二、配置makefile1、在Android系统编译LOG上找到编译器信息&#xff08;一般都会打印出来&#xff09;2、基于源MK构造 可独立运行的makefile3&#xff09;进入docker&#xff0c;在此makefile目录下敲make4&#xff09;最后根…

【Pandas】pandas DataFrame to_numpy

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…

2025常用的ETL 产品推荐:助力企业激活数据价值

在当今数字化时代&#xff0c;企业面临着海量数据的挑战与机遇&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;工具作为数据整合与分析的关键环节&#xff0c;其重要性日益凸显。ETL 厂商众多&#xff0c;各有优势&#xff0c;本文将从多个维度进行分析&…

LeetCode算法题(Go语言实现)_37

题目 给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。 如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&#xff0c;否则移动到它的左子节点。 改变前进方…

博途 TIA Portal之1200做从站与汇川EASY的TCP通讯

上篇我们写到了博途做主站与汇川EASY的通讯。通讯操作起来很简单,当然所谓的简单,也是相对的,如果操作成功一次,那么后面就很容易了, 如果操作不成功,就会很遭心。本篇我们将1200做从站,与汇川EASY做主站进行TCP的通讯。 1、硬件准备 1200PLC一台,带调试助手的PC机一…

Mysql(继续更新)

INnoDB 三特性 事务 外键 行级锁(开启事务时,查询后加FOR UPDATE) MySQL 使用 InnoDB&#xff0c;在 默认隔离级别 —— REPEATABLE READ&#xff08;可重复读&#xff09; 下 开启事务&#xff0c;执行 UPDATE 时默认会加行锁 只要事务没有提交 这条数据会锁住 …

[IOI 1994] 数字三角形 Number Triangles

题目链接 思路&#xff08;上到下&#xff09;&#xff1a; ①从上往下递推&#xff1a; f[i][j] max(f[i-1][j] g[i][j], f[i-1][j-1]g[i][j]) ②对最后一层&#xff0c;遍历一下&#xff0c;找到最大的答案。 代码&#xff08;上到下&#xff09;&#xff1a; #inclu…

基于Qt的串口通信工具

程序介绍 该程序是一个基于Qt的串口通信工具&#xff0c;专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括&#xff1a; 1. 核心功能 串口通信&#xff1a;支持串口开关、参数配置&#xff08;波特率、数据位、停止位、校验位&#xff09;及数据收发。 AT指令操作&a…

第5篇:Linux程序访问控制FPGA端LEDR<三>

Q&#xff1a;如何具体设计.c程序代码访问控制FPGA端外设&#xff1f; A&#xff1a;以控制DE1-SoC开发板的LEDR为例的Linux .C程序代码。头文件fcntl.h和sys/mman.h用于使用/dev/mem文件&#xff0c;以及mmap和munmap内核函数&#xff1b;address_map_arm.h指定了DE1-SoC_Com…

【学生管理系统升级版】

学生管理系统升级版 需求分析&#xff1a;注册功能:登录功能&#xff1a;验证码规则&#xff1a;忘记密码&#xff1a; 实操&#xff1a;系统主页面注册功能登录功能忘记密码效果演示 需求 为学生管理系统书写一个登陆、注册、忘记密码的功能。     只有用户登录成功之后&…

CSS Grid布局:从入门到放弃再到真香

Flexbox 与 Grid 布局&#xff1a;基础概念与特点 Flexbox Flexbox&#xff08;Flexible Box Layout&#xff09;&#xff0c;即弹性盒布局模型&#xff0c;主要用于创建一维布局&#xff0c;能够轻松实现元素在一行或一列中的排列、对齐与分布。通过display: flex属性启用 Fl…

C++怎么调用类中的函数

1. 栈上对象 调用普通成员方法 普通成员方法需要通过类的对象实例&#xff08;或指针、引用&#xff09;来调用。 示例&#xff1a; class MyClass { public:void normalMethod() {std::cout << "普通成员方法被调用" << std::endl;} };int main() {M…

go游戏后端开发31:麻将游戏的碰牌与胡牌逻辑

以下是润色后的版本&#xff1a; 1. 碰牌逻辑 1.1 触发碰牌 当一个玩家弃牌后&#xff0c;其他玩家可以选择碰牌。如果当前玩家决定碰牌&#xff0c;系统需要通知所有玩家这一操作。碰牌操作完成后&#xff0c;当前玩家需要出一张牌&#xff0c;系统同样需要通知所有玩家。 …

十分钟机器学习之--------------线性回归

线性回归&#xff08;linear regression&#xff09;是一种基于数学模型的算法&#xff0c;首先假设数据集与标签之间存在线性关系&#xff0c;然后简历线性模型求解参数。在实际生活中&#xff0c;线性回归算法因为其简单容易计算&#xff0c;在统计学经济学等领域都有广泛的应…

学透Spring Boot — 017. 处理静态文件

这是我的《学透Spring Boot》专栏的第17篇文章&#xff0c;了解更多内容请移步我的专栏&#xff1a; Postnull CSDN 学透 Spring Boot 目录 静态文件 静态文件的默认位置 通过配置文件配置路径 通过代码配置路径 静态文件的自动配置 总结 静态文件 以前的传统MVC的项目…

深入理解 JavaScript 数组查找:如何高效获取特定元素

深入理解 JavaScript 数组查找&#xff1a;如何高效获取特定元素 深入理解 JavaScript 数组查找&#xff1a;如何高效获取特定元素引言问题场景解决方案1. 使用 Array.prototype.find()2. 处理 Proxy 对象的情况3. 备选方案&#xff1a;Array.prototype.filter()4. 传统 for 循…