vue+SpringBoot使用WebSocket方式
WebSocket 原理
WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,旨在通過(guò)單一的、持久的連接,在客戶端和服務(wù)端之間進(jìn)行雙向數(shù)據(jù)交換。
它的工作原理如下:
- 協(xié)議握手:WebSocket 協(xié)議是基于 HTTP 協(xié)議的,客戶端首先通過(guò) 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ù),而無(wú)需重新建立連接。
- 數(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 來(lái)實(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)來(lái)簡(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 來(lái)連接到后端:
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è)按鈕來(lái)發(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ī)制,通過(guò)一個(gè)握手過(guò)程,客戶端與服務(wù)器建立 WebSocket 連接,并且后續(xù)通信無(wú)需重新建立連接。
- Java 服務(wù)端:Spring Boot 提供了對(duì) WebSocket 的內(nèi)建支持,我們通過(guò)
@MessageMapping注解來(lái)處理客戶端發(fā)送的消息,使用SimpMessagingTemplate來(lái)推送消息到訂閱的客戶端。 - Vue 客戶端:Vue 客戶端使用
SockJS和Stomp.js來(lái)實(shí)現(xiàn) WebSocket 連接,并能夠接收服務(wù)器推送的消息。用戶可以通過(guò)按鈕發(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ì)過(guò)程
- SpringBoot3整合WebSocket詳細(xì)指南
- SpringBoot實(shí)現(xiàn)WebSocket的示例代碼
- SpringBoot結(jié)合WebSocket實(shí)現(xiàn)聊天功能
- SpringBoot WebSocket連接報(bào)no mapping for GET問(wèn)題
相關(guān)文章
el-table表頭使用el-dropdown出現(xiàn)兩個(gè)下拉框的問(wèn)題及解決方法
本文給大家分享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)目中來(lái)實(shí)現(xiàn)一個(gè)可視化的3d項(xiàng)目,包含了一些常用的功能,場(chǎng)景、燈光、攝像機(jī)初始化,模型、天空盒的加載,以及鼠標(biāo)點(diǎn)擊和懸浮的事件交互,感興趣的朋友可以參考下2023-06-06
vue 獲取及修改store.js里的公共變量實(shí)例
今天小編就為大家分享一篇vue 獲取及修改store.js里的公共變量實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Vue3實(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)的呢,本文就來(lái)和大家詳細(xì)講講2023-02-02
vue實(shí)現(xiàn)文章內(nèi)容過(guò)長(zhǎng)點(diǎn)擊閱讀全文功能的實(shí)例
下面小編就為大家分享一篇vue實(shí)現(xiàn)文章內(nèi)容過(guò)長(zhǎng)點(diǎn)擊閱讀全文功能的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

