vue+SpringBoot使用WebSocket方式
WebSocket 原理
WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,旨在通過單一的、持久的連接,在客戶端和服務(wù)端之間進(jìn)行雙向數(shù)據(jù)交換。
它的工作原理如下:
- 協(xié)議握手:WebSocket 協(xié)議是基于 HTTP 協(xié)議的,客戶端首先通過 HTTP 請(qǐng)求向服務(wù)器發(fā)送一個(gè) WebSocket 握手請(qǐng)求(HTTP 協(xié)議的 Upgrade 請(qǐng)求),服務(wù)器如果支持 WebSocket,就會(huì)返回一個(gè) 101 響應(yīng),表示協(xié)議已切換到 WebSocket。
- 連接建立:一旦握手完成,客戶端和服務(wù)器就會(huì)建立起一個(gè)全雙工(雙向)通信連接,客戶端和服務(wù)器可以隨時(shí)相互發(fā)送數(shù)據(jù),而無需重新建立連接。
- 數(shù)據(jù)傳輸:WebSocket 允許客戶端和服務(wù)器在任意時(shí)刻發(fā)送消息,數(shù)據(jù)傳輸是基于幀的(每個(gè)數(shù)據(jù)包都是一個(gè)幀),并且?guī)臄?shù)據(jù)格式是二進(jìn)制或文本。
- 連接關(guān)閉:當(dāng)通信結(jié)束時(shí),任一方都可以發(fā)起連接關(guān)閉請(qǐng)求,關(guān)閉 WebSocket 連接。
與傳統(tǒng)的 HTTP 請(qǐng)求-響應(yīng)模式不同,WebSocket 提供了低延遲、實(shí)時(shí)、雙向通信的優(yōu)勢(shì),特別適用于需要即時(shí)數(shù)據(jù)傳輸?shù)膽?yīng)用,如即時(shí)聊天、在線游戲、股票行情等。
示例代碼
1. Java 服務(wù)端(使用 Spring Boot + WebSocket)
在 Java 服務(wù)端,我們可以使用 Spring Boot 和 Spring WebSocket 來實(shí)現(xiàn) WebSocket 服務(wù)。
步驟 1:添加依賴
首先,確保你的 pom.xml
文件中有以下依賴:
<dependencies> <!-- Spring Boot WebSocket 支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- Spring Boot Web 相關(guān)支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
步驟 2:創(chuàng)建 WebSocket 配置類
import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { // 設(shè)定應(yīng)用程序前綴(消息傳遞的目的地) config.enableSimpleBroker("/topic"); // 設(shè)置消息發(fā)送的目標(biāo)前綴 config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 設(shè)定WebSocket端點(diǎn) registry.addEndpoint("/ws").withSockJS(); } }
步驟 3:創(chuàng)建消息處理器
import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; @Controller public class WebSocketController { private final SimpMessagingTemplate messagingTemplate; public WebSocketController(SimpMessagingTemplate messagingTemplate) { this.messagingTemplate = messagingTemplate; } @MessageMapping("/chat") public void sendMessage(String message) { // 發(fā)送消息到 /topic/chat messagingTemplate.convertAndSend("/topic/chat", message); } }
messagingTemplate.convertAndSend("/topic/chat", message); } }
步驟 4:?jiǎn)?dòng) Spring Boot 應(yīng)用
創(chuàng)建一個(gè)啟動(dòng)類并運(yùn)行應(yīng)用:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebSocketApplication { public static void main(String[] args) { SpringApplication.run(WebSocketApplication.class, args); } }
2. Vue 客戶端(使用 Vue + WebSocket)
在 Vue 客戶端中,我們可以使用原生的 WebSocket API 或者使用庫(kù)(如 sockjs-client
)來簡(jiǎn)化處理。
步驟 1:安裝依賴
在 Vue 項(xiàng)目中,我們首先安裝 sockjs-client
和 stompjs
庫(kù):
npm install sockjs-client stompjs --save
步驟 2:創(chuàng)建 WebSocket 服務(wù)
創(chuàng)建一個(gè) Vue 文件,使用 WebSocket 來連接到后端:
import SockJS from 'sockjs-client'; import Stomp from 'stompjs'; export default { data() { return { stompClient: null, message: '' }; }, mounted() { this.connect(); }, methods: { connect() { const socket = new SockJS('http://localhost:8080/ws'); this.stompClient = Stomp.over(socket); this.stompClient.connect({}, frame => { console.log('Connected: ' + frame); // 訂閱消息 this.stompClient.subscribe('/topic/chat', (messageOutput) => { this.message = messageOutput.body; }); }); }, sendMessage() { this.stompClient.send("/app/chat", {}, "Hello, WebSocket!"); } } };
步驟 3:展示消息
在模板中展示接收到的消息,并提供一個(gè)按鈕來發(fā)送消息:
<template> <div> <div> <h2>Received Message: {{ message }}</h2> </div> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { data() { return { message: '' }; }, methods: { sendMessage() { this.$emit('sendMessage', 'Hello Server'); } } } </script>
步驟 4:運(yùn)行客戶端
確保你的 Vue 應(yīng)用能夠與后端服務(wù)通信,啟動(dòng) Vue 應(yīng)用并檢查瀏覽器控制臺(tái)的輸出。
總結(jié)
- WebSocket 原理:WebSocket 是一種全雙工協(xié)議,建立連接后,客戶端和服務(wù)器之間可以實(shí)時(shí)、雙向地交換數(shù)據(jù)。它基于 HTTP 協(xié)議的升級(jí)機(jī)制,通過一個(gè)握手過程,客戶端與服務(wù)器建立 WebSocket 連接,并且后續(xù)通信無需重新建立連接。
- Java 服務(wù)端:Spring Boot 提供了對(duì) WebSocket 的內(nèi)建支持,我們通過
@MessageMapping
注解來處理客戶端發(fā)送的消息,使用SimpMessagingTemplate
來推送消息到訂閱的客戶端。 - Vue 客戶端:Vue 客戶端使用
SockJS
和Stomp.js
來實(shí)現(xiàn) WebSocket 連接,并能夠接收服務(wù)器推送的消息。用戶可以通過按鈕發(fā)送消息,服務(wù)器接收到消息后進(jìn)行廣播。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 空指針HttpSession異常之SpringBoot集成WebSocket的方法
- SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式)
- SpringBoot實(shí)現(xiàn)websocket服務(wù)端及客戶端的詳細(xì)過程
- SpringBoot3整合WebSocket詳細(xì)指南
- SpringBoot實(shí)現(xiàn)WebSocket的示例代碼
- SpringBoot結(jié)合WebSocket實(shí)現(xiàn)聊天功能
- SpringBoot WebSocket連接報(bào)no mapping for GET問題
相關(guān)文章
el-table表頭使用el-dropdown出現(xiàn)兩個(gè)下拉框的問題及解決方法
本文給大家分享el-table在固定右邊列時(shí),表頭使用el-dropdown會(huì)出現(xiàn)兩個(gè)下拉框的解決方法,感興趣的朋友跟隨小編一起看看吧2024-07-07基于vue3+threejs實(shí)現(xiàn)可視化大屏效果
本文主要主要講述對(duì)threejs的一些api進(jìn)行基本的封裝,在vue3項(xiàng)目中來實(shí)現(xiàn)一個(gè)可視化的3d項(xiàng)目,包含了一些常用的功能,場(chǎng)景、燈光、攝像機(jī)初始化,模型、天空盒的加載,以及鼠標(biāo)點(diǎn)擊和懸浮的事件交互,感興趣的朋友可以參考下2023-06-06vue 獲取及修改store.js里的公共變量實(shí)例
今天小編就為大家分享一篇vue 獲取及修改store.js里的公共變量實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Vue3實(shí)現(xiàn)自定義指令攔截點(diǎn)擊事件的示例代碼
某些應(yīng)用場(chǎng)景會(huì)給點(diǎn)擊事件添加權(quán)限,不存在權(quán)限就攔截點(diǎn)擊事件,有權(quán)限就繼續(xù)正常觸發(fā)點(diǎn)擊事件。這樣的效果是如何實(shí)現(xiàn)的呢,本文就來和大家詳細(xì)講講2023-02-02vue實(shí)現(xiàn)文章內(nèi)容過長(zhǎng)點(diǎn)擊閱讀全文功能的實(shí)例
下面小編就為大家分享一篇vue實(shí)現(xiàn)文章內(nèi)容過長(zhǎng)點(diǎn)擊閱讀全文功能的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12