springboot3搭建WebSocket服务

springboot3搭建WebSocket服务

文章目录

  • springboot3搭建WebSocket服务
  • 前言
  • 一、创建SpringBoot工程
  • 二、pom.xml中引入依赖
    • 1.引入库
    • 2. application.yml配置
  • 三、主启动类
  • 四、WebSocket配置类
  • 五、编写WebSocket服务类
  • 六、编写测试页面
  • 总结


前言

本文详细介绍了如何在SpringBoot项目中搭建WebSocket服务,包括创建工程、添加依赖、配置文件、主启动类和WebSocket相关类的实现,以及编写测试页面以验证功能。

一、创建SpringBoot工程

在Intellij IDEA工具中使用SpringBoot项目初始化向导新建一个工程。

二、pom.xml中引入依赖

1.引入库

代码如下(示例):

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yuhao</groupId><artifactId>websocket</artifactId><version>0.0.1-SNAPSHOT</version><name>websocket</name><description>websocket</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><spring.boot.version>3.3.1</spring.boot.version><fastjson.version>1.2.83</fastjson.version><java.version>17</java.version></properties><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><dependencies><!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>3.2.0</version></dependency><!-- 统一 fastjson 版本 解决alibaba组件序列化漏洞问题 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2. application.yml配置

代码如下(示例):

server:port: 2001max-http-header-size: 8192
spring:thymeleaf:cache: false

该处使用的url网络请求的数据。


三、主启动类

package com.yuhao.websocket;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.socket.config.annotation.EnableWebSocket;@SpringBootApplication
@EnableWebSocket
@ServletComponentScan
public class WebsocketApplication {public static void main(String[] args) {SpringApplication.run(WebsocketApplication.class, args);}}

四、WebSocket配置类

package com.yuhao.websocket.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {/*** 注入ServerEndpointExporter,* 这个bean会自动注册使用了@ServerEndpoint注解声明的WebSocket Endpoint*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

五、编写WebSocket服务类

package com.yuhao.websocket.ws;import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;@ServerEndpoint("/ws/automate")
@Component
@Slf4j
@EqualsAndHashCode
public class WebSocketServer {private static int onLineCount = 0;//记录在线连接数,应该做成线程安全的//线程安全set,用来存储每个客户的WebSocketServer对象private static CopyOnWriteArraySet<WebSocketServer> webSocketServers = new CopyOnWriteArraySet<>();//与某个客户端的连接会话,需要通过它来给客户发送数据private Session session;/*** <p>* Description: 连接建立成功后调用的方法<br>* <p>* Datetime: 2020/5/28 22:25* </p>** @return* @since 2020/5/28 22:25*/@OnOpenpublic void onOpen(Session session) {System.out.println("连接了哦");this.session = session;webSocketServers.add(this);addOnlineCount();System.out.println();}/*** <p>* Description: 关闭会话连接<br>* <p>* Datetime: 2020/5/28 22:39* </p>** @param* @param* @return* @since 2020/5/28 22:39*/@OnClosepublic void onClose(Session session) {webSocketServers.remove(this);subOnlineCount();}/*** <p>* Description: 发送消息<br>* <p>* Datetime: 2020/5/28 22:39* </p>* @since 2020/5/28 22:39*/@OnMessagepublic void onMessage(String message, Session session) {System.out.println("来自客户端的消息:" + message);for (WebSocketServer socket : webSocketServers) {try {socket.sendMessage(message);} catch (IOException e) {e.printStackTrace();continue;}}}public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}@OnErrorpublic void onError(Session session, Throwable error) {System.out.println("发送消息失败");error.printStackTrace();}public static synchronized void addOnlineCount() {WebSocketServer.onLineCount++;}public static synchronized void subOnlineCount() {WebSocketServer.onLineCount--;}public static synchronized int getOnLineCount() {return onLineCount;}}

六、编写测试页面

创建index.html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket</title>
</head>
<body>
Welcome to WebSocket demo<br>
请输入消息:<input type="texarea" id="msg">
<button onclick="send()">发送消息</button>
<hr>
<button onclick="closeWebSocket()">关闭WebSocket连接</button>
<hr><div id="message"></div>
</body>
</html>
<script>let webSocket = null;if ('WebSocket' in window) {webSocket = new WebSocket('ws://localhost:2001/ws/automate')} else {alert("当前浏览器不支持WebSocket协议");}//连接出错时的回调webSocket.onerror = () => {setMessageInnerHTML("WebSocket连接失败");}//连接成功建立的回调webSocket.onopen = () => {setMessageInnerHTML("WebSocket连接成功");}//接收到消息的回调方法webSocket.onmessage = function (event) {setMessageInnerHTML(event.data);}//监听窗口关闭事件window.onbeforeunload = () => {closeWebSocket();}//关闭WebSocket连接closeWebSocket = () => {webSocket.close();}const send = () => {let message = document.getElementById("msg").value;webSocket.send(message);}function setMessageInnerHTML(innerHTML) {document.getElementById("message").innerHTML += innerHTML + '<br>';}
</script>

启动SpringBoot应用后,浏览器中输入地址进行测试:http://localhost:2001

总结

WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它的应用场景和作用如下:

  1. 即时聊天应用:WebSocket 可以实现实时的双向通信,适用于即时聊天应用,如在线聊天室、社交媒体平台的聊天功能等。
  2. 实时数据更新:WebSocket可以在服务器端有新数据时,自动将更新推送到客户端,适用于实时数据展示应用,如股票行情展示、实时监控系统等。
  3. 多人协作应用:WebSocket 可以方便地在多个用户之间实现实时协作,适用于多人在线编辑应用,如实时协作文档编辑、多人游戏等。
  4. 通知和提醒功能:WebSocket 可以用于发送通知和提醒给客户端,适用于实时消息提醒功能,如邮件通知、订单状态更新等。
  5. 实时地理定位:WebSocket 可以实时地将客户端的地理位置信息发送到服务器,适用于位置共享应用,如实时地图导航、出租车服务等。

总的来说,WebSocket 的作用是实现客户端和服务器之间的双向通信,可以实时地传递数据和消息,适用于需要实时交互和通信的应用场景。它相对于传统的 HTTP 请求-响应模式,具有更低的延迟和更高的效率。

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

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

相关文章

新型发电系统——光伏行业推动能源转型

一、发展背景 “十四五”期间&#xff0c;随着“双碳”目标提出及逐步落实&#xff0c;本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划&#xff0c;国家发改委能源研究所可再生能源发展中心副主任陶冶表示&#xff0c;“双碳”目标意味着国家…

Java面试题:比较Maven和Gradle的构建生命周期和依赖管理

Maven和Gradle是两个流行的构建工具&#xff0c;各自有不同的构建生命周期和依赖管理机制。以下是它们的比较&#xff1a; 构建生命周期 Maven Maven有一个固定的生命周期&#xff0c;由一系列阶段&#xff08;phases&#xff09;组成&#xff0c;每个阶段代表一个构建步骤。…

ubuntu更改ssh默认端口22

编辑 /etc/ssh/sshd_config&#xff0c;把Port前的#去掉&#xff0c;端口号改成8022&#xff0c;重启ssh。 // 1. 修改配置 sudo vi /etc/ssh/sshd_config// 2. 重启 ssh sudo systemctl restart ssh//【不想确认可跳过此步骤】 3. 查看 ssh 监听端口 sudo lsof -i:22 // 无…

MySQL改密

这里写目录标题 更改登录密码&#xff1a;有权限账号能登录mysql中&#xff1a;有权限账号不能登录mysql中&#xff1a;mysql5.6版本命令mysql5.7版本命令修改密码8.0版本改完后&#xff1a; mysql登录不上了本机安装了5.6后&#xff0c;又安装了mysql8.0 更改登录密码&#xf…

QT QVariant 类和 C++ 的 union有什么区别

QVariant 类和 C 的 union&#xff08;共用体&#xff09;在概念、用途和实现上有所不同。以下是对它们的区别和使用的简要概述&#xff1a; QVariantQT 如何储存多种数据类型&#xff08;QVariant &#xff09;-CSDN博客 概念&#xff1a;QVariant 是 Qt 框架中的一个类&…

易查分小程序丨查询开始和截止时间如何设置?

老师在发布查询时&#xff0c;希望让学生家长在指定的时间段才能查询&#xff0c;应该如何实现&#xff1f; 通过查询时段功能&#xff0c;老师可以自主设置查询开始和截止时间&#xff0c;下面就来教给大家如何使用吧&#xff01; 设置查询时段演示效果 &#x1f4cc;使用教程…

ASP.NETMVC-简单例子-数据库查询+razor使用+项目发布

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; asp.net mvc框架之EF的使用 - black娃 - 博客园 https://www.cnblogs.com/fjiqiang/p/11131365.html 目录 数据库查询要求思路操作 razor使用项目发布要求实现 数据库查询 要求 从服务器的数据库中查…

干货分享 | 学会这7个工具方法,数字化转型规划不是难题

提到数字化转型&#xff0c;首要做的便是分析企业现有的业务流程和价值流&#xff0c;发现企业利润来源的关键点&#xff0c;进而有针对性的数字化转型。要实现传统业务向数字化业务的转变&#xff0c;制定出高效、灵活的业务流程优化策略显得至关重要&#xff0c;这样才能找到…

简化数据提取:Excel-Extractor 使用指南

前言 在当今数据驱动的世界中&#xff0c;从复杂的 Excel 文件中提取和分析数据是许多业务和研究工作的基本需求。为了简化这一过程&#xff0c;Excel-Extractor 项目应运而生。本文将为你介绍 Excel-Extractor 的功能和如何在你的项目中使用它。 什么是 Excel-Extractor&…

【C#】制作图集

如题目&#xff0c;用好几个图片拼在一个大图里&#xff0c;博主是用于Unity游戏开发使用的&#xff0c;话不多说&#xff0c;上代码&#xff01; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging;namespace EffectsPac…

Spring Boot中的安全性配置详解

Spring Boot中的安全性配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何在Spring Boot应用中实现全面的安全性配置&#xff0c;保…

LED裸眼3D显示屏:开启视觉新体验

随着科技的不断进步&#xff0c;LED显示屏作为一种新型的显示技术&#xff0c;已经被广泛应用于各个领域。而其中&#xff0c;LED裸眼3D显示屏更是因其独特的技术原理和令人震撼的视觉效果&#xff0c;成为了业界关注的焦点。 裸眼3D显示屏是一种前沿的显示技术&#xff0c;它…

centos系统中neo4j数据库和python环境部署

最近因为项目需要&#xff0c;到了一个纯局域网环境中进行知识图谱构建。对于小规模数据&#xff0c;neo4j社区版能够满足基本的建模和查询需要&#xff08;大规模数据需要商业版&#xff0c;或是选用其他开源分布式图数据库如nebula等&#xff09;。本文主要介绍图数据库和pyt…

黄金架构编译部署

LNMP黄金架构部署 行走的CD: LNMP的解析过程:提到 LNMP的解析过程&#xff0c;我们应需要了解一个概念 CGI&#xff0c; CGI 就是指一个通用网关接口&#xff0c;用于 HTTP 服务器和其他应用服务器通讯的一个工具&#xff0c;在这 HTTP 服务器一般咱们就是指的是 Nginx、 Apac…

Java | Leetcode Java题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution {public int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n n & (n - 1);}return n;} }

获取当前操作系统的名称platform.system()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前操作系统的名称 platform.system() [太阳]选择题 在Python中&#xff0c;platform.system() 函数被用来获取什么信息&#xff1f; import platform print("【执行】platform.s…

如何在Java中实现自定义数据结构

如何在Java中实现自定义数据结构 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我将为大家介绍如何在Java中实现自定义数据结构。尽管Java提供了丰富的内置…

05 threeJs基础---阵列立方体和相机适配体验立方体

1.增加相机视角fov 注&#xff1a; 范围更大&#xff0c;意味着可以看到渲染范围更大&#xff0c;远小近大的视觉效果更明显 fov:眼球张开的角度&#xff0c;0时相当于闭眼。aspect:可视区域横纵比。near:眼睛能看到的最近垂直距离。far&#xff1a;眼睛能看到的最远垂直距离。…

Python中的@property装饰器:深入理解与应用

Python中的property装饰器&#xff1a;深入理解与应用 在Python中&#xff0c;property装饰器是一个强大的工具&#xff0c;它允许我们将方法作为属性来访问&#xff0c;使得代码更加简洁、清晰&#xff0c;并提供了更好的封装性。本文将深入探讨property装饰器的工作原理、应…

字节数组输出流转换为Base64方法记录

1. 今天在做字节数组转换Base64的时候遇到一个问题&#xff0c;转换成的Base64字符串自动换行&#xff0c;导致传输失败 关键代码&#xff1a; ByteArrayOutputStream out new ByteArrayOutputStream(); ............. BASE64Encoder encoder new BASE64Encoder(); Stri…