(自用)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.pswp.cn/pingmian/76208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76208.shtml
英文地址,請注明出處:http://en.pswp.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 循…