Java實戰:Spring Boot實現WebSocket實時通信

本文將詳細介紹如何在Spring Boot應用程序中實現WebSocket實時通信。我們將探討WebSocket的基本概念,以及如何使用Spring Boot和Spring WebSocket模塊來實現WebSocket服務器和客戶端。此外,我們將通過具體的示例來展示如何在Spring Boot應用程序中配置和使用WebSocket,以及如何實現實時消息傳遞和群發消息等功能。本文適合希望使用WebSocket技術實現實時通信的Spring Boot開發者閱讀。

一、引言

在現代Web應用程序中,實時通信是一個關鍵需求,用于實現即時消息傳遞、在線聊天、實時數據同步等功能。WebSocket是一種網絡通信協議,它提供了一種全雙工通信渠道,允許服務器和客戶端之間進行實時數據交換。Spring Boot提供了一種簡便的方式來集成WebSocket技術,以實現實時通信功能。本文將介紹如何在Spring Boot應用程序中實現WebSocket實時通信。

二、WebSocket的基本概念

1. 什么是WebSocket?
WebSocket是一種網絡通信協議,它提供了一種全雙工通信渠道,允許服務器和客戶端之間進行實時數據交換。WebSocket協議基于TCP協議,通過WebSocket連接,服務器和客戶端可以相互發送消息,實現實時通信。
2. WebSocket的特點

  • 全雙工通信:WebSocket協議支持服務器和客戶端之間的全雙工通信,客戶端和服務器可以同時發送消息。
  • 持久連接:WebSocket連接一旦建立,將持續保持打開狀態,直到客戶端或服務器關閉連接。
  • 跨域通信:WebSocket協議支持跨域通信,允許不同域的服務器與客戶端建立連接。

三、在Spring Boot中實現WebSocket實時通信

1. 添加Spring WebSocket依賴
在項目的pom.xml文件中,添加Spring Boot的Spring WebSocket依賴:

<dependencies><!-- Spring Boot Web依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot WebSocket依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
</dependencies>

2. 創建WebSocket配置類
創建一個WebSocket配置類,用于配置WebSocket服務器端點。以下是一個簡單的WebSocket配置類示例:

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/websocket-endpoint").withSockJS();}
}

在上面的代碼中,我們創建了一個名為WebSocketConfig的配置類,它實現了WebSocketMessageBrokerConfigurer接口。這個類用于配置WebSocket消息代理和注冊STOMP(Simple Text Oriented Messaging Protocol)端點。
3. 創建消息模型
創建一個簡單的消息模型類,用于表示WebSocket消息。以下是一個簡單的消息模型類示例:

package com.example.demo.model;
public class Message {private String content;private String sender;// getter和setter方法
}

在上面的代碼中,我們創建了一個名為Message的模型類,它包含兩個屬性:contentsender
4. 創建消息處理器
創建一個消息處理器類,用于處理WebSocket消息。以下是一個簡單的消息處理器類示例:

package com.example.demo.handler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo
import org.springframework.stereotype.Controller;
@Controller
public class MessageHandler {@MessageMapping("/send")@SendTo("/topic/messages")public Message sendMessage(Message message) {return new Message("Hello, WebSocket!", "System");}
}

在上面的代碼中,我們創建了一個名為MessageHandler的控制器類,它包含一個名為sendMessage的方法。這個方法將處理發送到/send目的地的消息,并將消息發送到/topic/messages主題。
5. 創建前端代碼
創建一個簡單的HTML頁面和JavaScript代碼,用于連接到WebSocket服務器并發送消息。以下是一個簡單的HTML頁面示例:

<!DOCTYPE html>
<html>
<head><title>WebSocket Demo</title><script src="https://cdn.jsdelivr.net/npm/sockjs-client/dist/sockjs.min.js"></script><script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>
</head>
<body><div><input type="text" id="messageInput" placeholder="Type a message..."><button onclick="sendMessage()">Send</button></div><ul id="messagesList"></ul><script>var socket = new SockJS('/websocket-endpoint');var stompClient = Stomp.over(socket);stompClient.connect({}, function (frame) {stompClient.subscribe('/topic/messages', function (message) {var messagesList = document.getElementById('messagesList');var listItem = document.createElement('li');listItem.textContent = message.body;messagesList.appendChild(listItem);});});function sendMessage() {var messageInput = document.getElementById('messageInput');stompClient.send('/app/send', {}, messageInput.value);messageInput.value = '';}</script>
</body>
</html>

在上面的代碼中,我們創建了一個簡單的HTML頁面,包含一個輸入框和一個按鈕。當用戶點擊按鈕時,JavaScript代碼會連接到WebSocket服務器,并訂閱/topic/messages主題。當服務器發送消息到該主題時,JavaScript代碼會將消息添加到頁面上的消息列表。

四、實現實時消息傳遞和群發消息

1. 實時消息傳遞
要實現實時消息傳遞,我們可以在MessageHandler類中創建一個方法,用于接收并處理從客戶端發送的消息。以下是一個實現實時消息傳遞的示例:

package com.example.demo.handler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class MessageHandler {// 省略其他代碼@MessageMapping("/receive")@SendTo("/topic/messages")public Message receiveMessage(Message message) {return new Message("Received your message: " + message.getContent(), "System");}
}

在上面的代碼中,我們添加了一個名為receiveMessage的方法,用于接收并處理發送到/receive目的地的消息。這個方法會將接收到的消息發送到/topic/messages主題。
2. 群發消息
要實現群發消息,我們可以在WebSocketConfig類中配置一個廣播代理。以下是一個實現群發消息的示例:

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {// 省略其他代碼@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");config.setBrokerDeliveryMode(MessageBrokerRegistry.BrokerDeliveryMode.BROADCASTING);}// 省略其他代碼
}

在上面的代碼中,我們通過將setBrokerDeliveryMode方法的參數設置為BROADCASTING來啟用廣播代理。這意味著所有發送到/topic/messages主題的消息都會被廣播到所有連接的客戶端。

五、總結

本文詳細介紹了如何在Spring Boot應用程序中實現WebSocket實時通信。我們首先了解了WebSocket的基本概念和特點,然后學習了如何使用Spring Boot和Spring WebSocket模塊來實現WebSocket服務器和客戶端。我們還通過具體的示例展示了如何在Spring Boot應用程序中配置和使用WebSocket,以及如何實現實時消息傳遞和群發消息等功能。
通過本文,您應該已經掌握了如何使用Spring Boot實現WebSocket實時通信。您學會了如何添加Spring WebSocket依賴、創建WebSocket配置類、創建消息模型、創建消息處理器,以及如何實現實時消息傳遞和群發消息。希望本文能夠幫助您在開發Spring Boot應用程序時更加得心應手。如果您有任何疑問或建議,請隨時留言交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【探索AI】十二 深度學習之第2周:深度神經網絡(一)深度神經網絡的結構與設計

第2周&#xff1a;深度神經網絡 將從以下幾個部分開始學習&#xff0c;第1周的概述有需要詳細講解的的同學自行百度&#xff1b; 深度神經網絡的結構與設計 深度學習的參數初始化策略 過擬合與正則化技術 批標準化與Dropout 實踐&#xff1a;使用深度學習框架構建簡單的深度神…

《More Effective C++》- 極精簡版 1-10條

本文章屬于專欄《業界Cpp進階建議整理》 本文列出《More Effective C》的1-10條的個人理解的極精簡版本。 1、仔細區分pointers和references 使用引用的情況&#xff1a; 一旦代表的該對象就不能改變&#xff0c;應該選擇reference&#xff08;優勢是使用時不需要判是否空&…

微信小程序的醫院食堂訂餐系統uniapp+vue+springboot/django/php

針對患者訂餐的管理現狀&#xff0c;本微信小程序的患者訂餐主要實現以下幾個目標&#xff1a; 1.系統界面簡潔&#xff0c;操作簡便。 2.擁有精準&#xff0c;高效的查詢功能。 3.能使管理人員能夠及時的獲得精確的信息。 4.對數據內容的管理安全&#xff0c;…

安卓websocket(客服端和服務端寫在app端) 案例

廢話不多說直接上代碼 首選導入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…

騰訊:《智能科技 跨界相變——2024數字科技前沿應用趨勢》

1月23日&#xff0c;騰訊發布了題為《智能科技 跨界相變——2024數字科技前沿應用趨勢》的報告&#xff0c;報告從計算重塑、智能升維、沉浸交互、未來連接四個方面&#xff0c;對100多項未來技術和重點方向給出了趨勢性判斷。并表示我們正駛向一個由連接衍生交互、由計算催生智…

把簡單留給用戶,把復雜交給 AI

2024 年伊始&#xff0c;Kyligence 聯合創始人兼 CEO 韓卿&#xff08;Luke&#xff09;分享了對 AI 與數據行業的一些戰略思考&#xff0c;以及對中美企業服務市場的見解&#xff0c;引發業界同仁的廣泛共鳴。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技術應用風起云涌…

leetcode 2.29

Leetcode hot100 二分查找1. 搜索插入位置2. 搜索二維矩陣 二分查找 1. 搜索插入位置 搜索插入位置 標準二分的寫法&#xff1a; 復雜度分析 時間復雜度&#xff1a;O(log?n)&#xff0c;其中 n 為數組的長度。二分查找所需的時間復雜度為 O(log?n)。 空間復雜度&#xff1…

FLask會話技術和Flask模板語言

二、FLask會話技術和Flask模板語言 1.會話技術 cookie 客戶端的會話技術&#xff1a;讓服務器認識瀏覽器&#xff0c;常用于登錄 cookie本身由瀏覽器保存&#xff0c;通過Response將cookie寫到瀏覽器上&#xff0c;下一次訪問&#xff0c;瀏覽器會根據不同的規則攜帶cookie過…

ssm656基于JAVA的校園失物招領平臺的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 課題…

(k8s中)docker netty OOM問題記錄

1、首先查看docker的內存占用情況&#xff1a; docker top 容器名 -u 查看內存cpu占用率&#xff08;容器名來自kubectl describe pod xxx或者docker ps&#xff09; 可以看出內存一直增長&#xff0c;作為IO代理這是不正常的。 2、修改啟動參數和配置文件 需要注意的是為了…

AI推介-多模態視覺語言模型VLMs論文速覽(arXiv方向):2024.01.01-2024.01.10

論文目錄~ 1.RoboFusion: Towards Robust Multi-Modal 3D obiect Detection via SAM2.Aligned with LLM: a new multi-modal training paradigm for encoding fMRI activity in visual cortex3.3DMIT: 3D Multi-modal Instruction Tuning for Scene Understanding4.Incorporati…

電子科技大學課程《計算機網絡系統》(持續更新)

前言 本校的課程課時有所縮減&#xff0c;因此可能出現與你學習的課程有所減少的情況&#xff0c;因此對其他學校的同學更多的作為參考作用。本文章適合學生的期中期末考試&#xff0c;以及想要考研電子科技大學的同學&#xff0c;電子科技大學同學請先看附言。 第一章 計算…

Unity - SerializeReference特性

作用&#xff1a;在編輯器面板上持久序列化一個接口或者抽象類對象 特點&#xff1a; 1.添加SerializeReference后, 即使字段是私有的, 也無需添加SerializeField屬性, 二者同有將私有字段序列化的能力. 2.SerializeReference屬性允許字段為null, 這點與默認序列化行為不同,…

Angular ts中監聽變量

這邊有個需求&#xff0c;需要監控某個input的變量變化&#xff0c;突然忘記怎么監聽變量了&#xff0c;查了下&#xff0c;記錄 這邊使用angluar/core中的OnChanges接口&#xff0c;然后實現 ngOnChanges方法&#xff0c;只要變量發生了變化&#xff0c;這里面都可以監聽到&am…

蘋果手機如何下載微信視頻號的視頻?親測可用的方法!

以下是如何下載微信視頻號的視頻的辦法&#xff0c;首先是視頻號下載提取器&#xff0c;下載視頻號視頻的&#xff01; 需配合微信PC版或者手機進行操作。這里以蘋果手機為例 首先&#xff0c;你需要在視頻號頻道找到你想要下載的視頻&#xff0c;然后通過點擊選擇你需要播放的…

[Android View] 可繪制形狀 (Shape Xml)

一切以官方文檔為主 官方文檔https://developer.android.com/guide/topics/resources/drawable-resource?hlzh-cn#Shape 什么是可繪制形狀 可以理解為用xml文件來描述一個簡單的Drawable圖形&#xff0c;比如說以下這段xml就可以用來描述一個白色的圓形&#xff1a; <?…

Centos中安裝Docker及Docker的使用

在centos7系統中安裝指定版本的docker,并通過docker使用安裝mysql為例,闡述docker的使用。 2.1、Docker卸載及安裝yum依賴 【卸載Docker,如果安裝的Docker的版本不合適】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

智能汽車軟硬件產品CES展示汽車技術新亮點

智能汽車是汽車產業發展的新趨勢&#xff0c;是未來汽車發展的必然方向。智能汽車是指搭載了先進的傳感器、控制器、執行器等部件&#xff0c;并融合了人工智能、自動駕駛等技術&#xff0c;能夠實現部分或完全自動駕駛、智能網聯等功能的汽車。 近年來&#xff0c;智能汽車技…

抖店怎么開店注冊?新手需要準備什么?這幾個步驟很關鍵!

我是電商珠珠 不少人瞄準了抖店這個短視頻電商勢頭&#xff0c;想要在今年大干一場。關于抖店注冊這方面&#xff0c;部分人還不太清楚&#xff0c;今天我就帶大家一步步注冊&#xff0c;看一遍就會了。 前期準備資料 前期新手的話&#xff0c;需要準備一張個體工營業執照&a…

Java實戰:Web實時消息推送技術

一、引言 隨著互聯網技術的飛速發展和用戶對實時交互體驗的追求&#xff0c;Web實時消息推送已成為眾多在線平臺的核心功能之一。無論是社交網絡的新消息通知、協同辦公工具的實時更新&#xff0c;還是電商平臺的訂單狀態變更&#xff0c;都需要實時、準確地將信息推送到用戶的…