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.pswp.cn/diannao/36817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36817.shtml
英文地址,請注明出處:http://en.pswp.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…