国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot 3 + Vue 3 整合 WebSocket (STOMP協(xié)議) 實(shí)現(xiàn)廣播和點(diǎn)對(duì)點(diǎn)實(shí)時(shí)消息

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot 3 + Vue 3 整合 WebSocket (STOMP協(xié)議) 實(shí)現(xiàn)廣播和點(diǎn)對(duì)點(diǎn)實(shí)時(shí)消息。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

?? 作者主頁(yè): 有來(lái)技術(shù)
?? 開(kāi)源項(xiàng)目: youlai-mall ?? vue3-element-admin ?? youlai-boot
?? 倉(cāng)庫(kù)主頁(yè): Gitee ?? Github ?? GitCode
?? 歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯(cuò)誤敬請(qǐng)糾正!

springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

引言

WebSocket是一種在Web瀏覽器與Web服務(wù)器之間建立雙向通信的協(xié)議,而Spring Boot提供了便捷的WebSocket支持。本篇博客將介紹如何在Spring Boot 3中整合WebSocket,并使用Vue 3構(gòu)建簡(jiǎn)單而強(qiáng)大的實(shí)時(shí)通信應(yīng)用。

核心概念

什么是 WebSocket ?

WebSocket是一種在單個(gè)TCP連接上提供全雙工通信的協(xié)議,允許客戶端和服務(wù)器之間實(shí)時(shí)雙向通信,無(wú)需客戶端發(fā)起請(qǐng)求。其優(yōu)勢(shì)在于低延遲和高效率,適用于即時(shí)通訊、在線游戲、實(shí)時(shí)協(xié)作編輯等場(chǎng)景。

什么是 STOMP ?

STOMP 官網(wǎng): 官方文檔 | 中文文檔

STOMP是一種基于文本的消息傳遞協(xié)議,用于實(shí)現(xiàn)消息傳遞系統(tǒng)之間的互操作性。它簡(jiǎn)單、跨語(yǔ)言、適應(yīng)性強(qiáng),支持多種消息傳遞模式。通常與WebSocket結(jié)合,提供瀏覽器和服務(wù)器之間的實(shí)時(shí)雙向通信。

STOMP是一種簡(jiǎn)單的消息傳遞協(xié)議,初衷是為腳本語(yǔ)言(如 Ruby、 Python 和 Perl)和web框架創(chuàng)建一種基于文本的簡(jiǎn)單異步消息協(xié)議。相比于正式誕生于2011年的WebSocket,STOMP在此之前廣泛使用了十年以上,并且得到了很多客戶端(如stomp.js、Gozirra、stomp.py、stompngo等)、消息代理端(如ActiveMQ、RabbitMQ等)、工具庫(kù)的支持,目前最新的協(xié)議版本為2012年1.2版本。

具體來(lái)說(shuō),STOMP是一種基于Frame的協(xié)議,每個(gè)Frame由一個(gè)命令Command、一組Headers和可選的正文Body組成,如下是一個(gè)STOMP frame的基本結(jié)構(gòu)示例:

SEND   //作為COMMAND
Authorization:Bearer xxx        //作為Headers
content-type:application/json   //作為Headers

Hello World!  //消息內(nèi)容,可以多行,直到^@為止  //作為Body
^@ //此Frame結(jié)束

STOMP On Spring WebSocket

spring-framework #websocket-stomp

Spring Framework 從 4.0.0 加入了spring-websocket 和 spring-messaging 兩大模塊。

從Spring文檔的篇幅、提供的應(yīng)用樣例以及spring-boot-starter-websocket直接引入了spring-websocket 和 spring-messaging模塊(包含了STOMP等相關(guān)內(nèi)容)等各種情況,不難看出基于STOMP做為其消息交互協(xié)議的方式,是spring主推的完整的websocket解決方案即 STOMP On Spring WebSocket,即使用STOMP也是spring框架的選擇。

WebSocket 服務(wù)端(SpringBoot3)

添加依賴

首先,在pom.xml中添加WebSocket依賴:

<!-- WebSocket依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket 配置類

配置 WebSocket 支持實(shí)時(shí)雙向通信和消息傳遞,使用STOMP協(xié)議。提供連接端點(diǎn) “/ws”,支持跨域WebSocket連接,配置消息代理實(shí)現(xiàn)廣播和點(diǎn)對(duì)點(diǎn)推送。

package com.youlai.system.config;

/**
 * WebSocket 配置
 *
 * @author haoxr
 * @since 2.4.0
 */
@Configuration
@EnableWebSocketMessageBroker // 啟用WebSocket消息代理功能和配置STOMP協(xié)議,實(shí)現(xiàn)實(shí)時(shí)雙向通信和消息傳遞
@RequiredArgsConstructor
@Slf4j
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
	
    private final JwtTokenProvider jwtTokenProvider;

    /**
     * 注冊(cè)一個(gè)端點(diǎn),客戶端通過(guò)這個(gè)端點(diǎn)進(jìn)行連接
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry
                .addEndpoint("/ws")   // 注冊(cè)了一個(gè) /ws 的端點(diǎn)
                .setAllowedOriginPatterns("*") // 允許跨域的 WebSocket 連接
                .withSockJS();  // 啟用 SockJS (瀏覽器不支持WebSocket,SockJS 將會(huì)提供兼容性支持)
    }

    /**
     * 配置消息代理
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 客戶端發(fā)送消息的請(qǐng)求前綴
        registry.setApplicationDestinationPrefixes("/app");

        // 客戶端訂閱消息的請(qǐng)求前綴,topic一般用于廣播推送,queue用于點(diǎn)對(duì)點(diǎn)推送
        registry.enableSimpleBroker("/topic", "/queue");

        // 服務(wù)端通知客戶端的前綴,可以不設(shè)置,默認(rèn)為user
        registry.setUserDestinationPrefix("/user");
    }
    
    /**
     * 配置客戶端入站通道攔截器
     * <p>
     * 添加 ChannelInterceptor 攔截器,用于在消息發(fā)送前,從請(qǐng)求頭中獲取 token 并解析出用戶信息(username),用于點(diǎn)對(duì)點(diǎn)發(fā)送消息給指定用戶
     *
     * @param registration 通道注冊(cè)器
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                // 如果是連接請(qǐng)求(CONNECT 命令),從請(qǐng)求頭中取出 token 并設(shè)置到認(rèn)證信息中
                if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) {
                    // 從連接頭中提取授權(quán)令牌
                    String bearerToken = accessor.getFirstNativeHeader(HttpHeaders.AUTHORIZATION);

                    // 驗(yàn)證令牌格式并提取用戶信息
                    if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith("Bearer ")) {
                        try {
                            // 移除 "Bearer " 前綴,從令牌中提取用戶信息(username), 并設(shè)置到認(rèn)證信息中
                            String tokenWithoutPrefix = bearerToken.substring(7);
                            String username = jwtTokenProvider.getUsername(tokenWithoutPrefix);

                            if (StrUtil.isNotBlank(username)) {
                                accessor.setUser(() -> username);
                                return message;
                            }
                        } catch (Exception e) {
                            log.error("Failed to process authentication token.", e);
                        }
                    }
                }
                // 不是連接請(qǐng)求,直接放行
                return ChannelInterceptor.super.preSend(message, channel);
            }
        });
    }
}

WebSocket 監(jiān)聽(tīng)和發(fā)送

package com.youlai.system.controller;

import com.youlai.system.model.dto.ChatMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

/**
 * WebSocket 測(cè)試控制器
 *
 * @author haoxr
 * @since 2.3.0
 */
@RestController
@RequestMapping("/websocket")
@RequiredArgsConstructor
@Slf4j
public class WebsocketController {

    private final SimpMessagingTemplate messagingTemplate;


    /**
     * 廣播發(fā)送消息
     *
     * @param message 消息內(nèi)容
     */
    @MessageMapping("/sendToAll")
    @SendTo("/topic/notice")
    public String sendToAll(String message) {
        return "服務(wù)端通知: " + message;
    }

    /**
     * 點(diǎn)對(duì)點(diǎn)發(fā)送消息
     * <p>
     * 模擬 張三 給 李四 發(fā)送消息場(chǎng)景
     *
     * @param principal 當(dāng)前用戶
     * @param username  接收消息的用戶
     * @param message   消息內(nèi)容
     */
    @MessageMapping("/sendToUser/{username}")
    public void sendToUser(Principal principal, @DestinationVariable String username, String message) {

        String sender = principal.getName(); // 發(fā)送人
        String receiver = username; // 接收人

        log.info("發(fā)送人:{}; 接收人:{}", sender, receiver);
        // 發(fā)送消息給指定用戶 /user/{username}/queue/greeting
        messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message));
    }
}

WebSocket 客戶端(Vue3)

安裝依賴

# WebSocket 客戶端和類型定義
npm i sockjs-client  
npm i -D @types/sockjs-client
# STOMP 協(xié)議的 JavaScript 客戶端和類型定義
npm i stompjs
npm i -D @types/stompjs
# net 是 Node核心模塊之一,用于創(chuàng)建 TCP 服務(wù)器和客戶端模塊
npm i net -S

WebSocket 客戶端連接

下面是 Websocket 連接部分關(guān)鍵代碼,完整代碼:websocket.vue

<!-- websocket 示例 -->
<script setup lang="ts">
import SockJS from "sockjs-client";
import Stomp from "stompjs";

import { useUserStoreHook } from "@/store/modules/user";

const userStore = useUserStoreHook(); // websocket 連接傳遞 token

const isConnected = ref(false);
const socketEndpoint = ref("http://localhost:8989/ws"); 

let stompClient: Stomp.Client;
/**
 * 連接
 */
function connect() {
  let socket = new SockJS(socketEndpoint.value);

  stompClient = Stomp.over(socket);

  stompClient.connect(
    { Authorization: userStore.token },
    () => {
      console.log("連接成功");
    },
    (error) => {
      console.log("連接失敗: " + error);
    }
  );
}
/**
 * 斷開(kāi)連接
 */
function disconnect() {
  if (stompClient && stompClient.connected) {
    stompClient.disconnect(() => {
  	 console.log("斷開(kāi)連接");
    });
  }
}

onMounted(() => {
  connect();
});
</script>


WebSocket 客戶端訂閱

下面是 Websocket 訂閱部分關(guān)鍵代碼,完整代碼:websocket.vue

stompClient.subscribe("/topic/notice", (res: any) => {
    console.log("訂閱廣播成功:" + res.body);
});

stompClient.subscribe("/user/queue/greeting", (res) => {
    console.log("訂閱點(diǎn)對(duì)點(diǎn)成功:" + res.body);
});
  • /topic/notice

    對(duì)應(yīng)服務(wù)端廣播隊(duì)列

    springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

  • /user/queue/greeting

    對(duì)應(yīng)服務(wù)端點(diǎn)對(duì)點(diǎn)隊(duì)列,其中 /user/ 前綴是 WebSocketConfig 里通過(guò) registry.setUserDestinationPrefix("/user") 設(shè)定的服務(wù)端通知客戶端的前綴。

    springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

WebSocket 客戶端推送

下面是 Websocket 訂閱部分關(guān)鍵代碼,完整代碼:websocket.vue


function sendToAll() {
  stompClient.send("/app/sendToAll", {},  "親愛(ài)的大冤種們,由于一只史詩(shī)級(jí)的BUG,系統(tǒng)版本已經(jīng)被迫回退到了0.0.1。");
  console.log("廣播消息發(fā)送成功");	
}

function sendToUser() {
  stompClient.send("/app/sendToUser/root", {}, "嗨! root 我是 admin ,想和您交個(gè)朋友");
  console.log("點(diǎn)對(duì)點(diǎn)消息發(fā)送成功");	
}
  • /app/sendToAll

    客戶端發(fā)送的目標(biāo)地址,指定服務(wù)端 @MessageMapping("/sendToAll") 方法處理此消息

    其中 /app 是 WebSocketConfig 里通過(guò) registry.setApplicationDestinationPrefixes("/app") 設(shè)定的客戶端發(fā)送目標(biāo)地址的前綴

    springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

  • /app/sendToUser/root

    對(duì)應(yīng)服務(wù)端處理消息的方法如下:

    springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

WebSocket 測(cè)試

在線測(cè)試地址: vue3-element-admin#websocket

WebSocket 連接測(cè)試

springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

WebSocket 廣播測(cè)試

springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

WebSocket 點(diǎn)對(duì)點(diǎn)測(cè)試

springboot3 websocket,# Spring Boot,spring boot,vue.js,websocket,typescript,java

項(xiàng)目源碼

Github Gitee
后端 youlai-boot ?? youlai-boot ??
前端 vue3-element-admin ?? vue3-element-admin ??

結(jié)語(yǔ)

本文深入介紹了在Spring Boot 3中整合WebSocket及Vue 3構(gòu)建實(shí)時(shí)通信應(yīng)用。選擇STOMP協(xié)議,配置服務(wù)端、客戶端,實(shí)現(xiàn)連接、消息廣播和點(diǎn)對(duì)點(diǎn)推送。通過(guò)在線測(cè)試驗(yàn)證整合效果,包括連接、廣播和點(diǎn)對(duì)點(diǎn)消息。希望讀者通過(guò)這個(gè)實(shí)例更好地理解WebSocket在Spring Boot中的應(yīng)用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-783094.html

到了這里,關(guān)于Spring Boot 3 + Vue 3 整合 WebSocket (STOMP協(xié)議) 實(shí)現(xiàn)廣播和點(diǎn)對(duì)點(diǎn)實(shí)時(shí)消息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Boot整合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信,前端實(shí)時(shí)通信,前后端實(shí)時(shí)通信

    實(shí)時(shí)通信在現(xiàn)代Web應(yīng)用中扮演著越來(lái)越重要的角色,無(wú)論是在線聊天、股票價(jià)格更新還是實(shí)時(shí)通知,WebSocket都是實(shí)現(xiàn)這些功能的關(guān)鍵技術(shù)之一。Spring Boot作為一個(gè)簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的框架,其對(duì)WebSocket的支持也非常友好。本文將詳細(xì)介紹如何在Spring Boot中整合WebSocket,實(shí)現(xiàn)一

    2024年04月27日
    瀏覽(51)
  • Spring Boot整合WebSocket

    Spring Boot整合WebSocket

    在HTTP協(xié)議中,所有的請(qǐng)求都是由客戶端發(fā)起的,由服務(wù)端進(jìn)行響應(yīng),服務(wù)端無(wú)法向客戶端推送消息,但是在一些需要即時(shí)通信的應(yīng)用中,又不可避免地需要服務(wù)端向客戶端推送消息,傳統(tǒng)的解決方案主要有如下幾種。 輪詢 輪詢是最簡(jiǎn)單的一種解決方案,所謂輪詢,就是客戶

    2024年02月05日
    瀏覽(23)
  • spring boot 項(xiàng)目整合 websocket

    spring boot 項(xiàng)目整合 websocket

    ? ? ? ? 負(fù)責(zé)的項(xiàng)目有一個(gè)搜索功能,搜索的范圍幾乎是全表掃,且數(shù)據(jù)源類型賊多。目前對(duì)搜索的數(shù)據(jù)量量級(jí)未知,但肯定不會(huì)太少,不僅需要搜索還得點(diǎn)擊下載文件。 ? ? ? ? ? 關(guān)于搜索這塊類型 眾多,未了避免有個(gè)別極大數(shù)據(jù)源影響整個(gè)搜索效率,我采用多線程異步

    2024年02月11日
    瀏覽(22)
  • 在 Spring Boot 中整合、使用 WebSocket

    WebSocket 是一種基于 TCP 協(xié)議的全雙工通信協(xié)議,它允許客戶端和服務(wù)器之間建立持久的、雙向的通信連接。相比傳統(tǒng)的 HTTP 請(qǐng)求 - 響應(yīng)模式,WebSocket 提供了實(shí)時(shí)、低延遲的數(shù)據(jù)傳輸能力。通過(guò) WebSocket,客戶端和服務(wù)器可以在任意時(shí)間點(diǎn)互相發(fā)送消息,實(shí)現(xiàn)實(shí)時(shí)更新和即時(shí)通

    2024年04月13日
    瀏覽(17)
  • HTTP、WebSocket、STOMP、MQTT 協(xié)議

    HTTP、WebSocket、STOMP、MQTT 協(xié)議

    TCP/IP 是用于因特網(wǎng) (Internet) 的通信協(xié)議,是對(duì)計(jì)算機(jī)必須遵守的規(guī)則的描述,只有遵守這些規(guī)則,計(jì)算機(jī)之間才能進(jìn)行通信。 TCP/IP是基于TCP和IP這兩個(gè)最初的協(xié)議之上的不同的通信協(xié)議的大集合,是一個(gè)協(xié)議族。 1-1、TCP(傳輸控制協(xié)議,Transmission Control Protocol) 在計(jì)算機(jī)網(wǎng)

    2024年04月15日
    瀏覽(27)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-長(zhǎng)鏈接WebSocket使用stomp協(xié)議stomp_dart_client

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-長(zhǎng)鏈接WebSocket使用stomp協(xié)議stomp_dart_client

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-長(zhǎng)鏈接WebSocket使用stomp協(xié)議stomp_dart_client 在app中經(jīng)常會(huì)使用長(zhǎng)連接進(jìn)行消息通信,這里記錄一下基于websocket使用stomp協(xié)議的使用。 1.1 stomp介紹 stomp,Streaming Text Orientated Message Protocol,是流文本定向消息協(xié)議,是一種為MOM(Message Oriented Middleware,面向消息的中間件

    2024年02月13日
    瀏覽(27)
  • WebSocket的那些事(4-Spring中的STOMP支持詳解)

    WebSocket的那些事(4-Spring中的STOMP支持詳解)

    上節(jié)我們?cè)?WebSocket的那些事(3-STOMP實(shí)操篇)中介紹了 STOMP 協(xié)議以及和 Spring 集成的簡(jiǎn)單示例,這一節(jié)我們我們將用一個(gè)聊天Demo程序詳細(xì)介紹相關(guān)注解使用和原理、攔截器、用戶身份校驗(yàn)、還有事件。 @MessageMapping :消息路由注解,功能和MVC的 @RequestMapping 等注解類似,被注解

    2024年02月07日
    瀏覽(34)
  • WebSocket的那些事(5-Spring中STOMP連接外部消息代理)

    WebSocket的那些事(5-Spring中STOMP連接外部消息代理)

    上節(jié)我們?cè)?WebSocket的那些事(4-Spring中的STOMP支持詳解) 中詳細(xì)說(shuō)明了通過(guò) Spring內(nèi)置消息代理 結(jié)合 STOMP 子協(xié)議進(jìn)行Websocket通信,以及相關(guān)注解的使用及原理。 但是Spring內(nèi)置消息代理會(huì)有一些限制,比如只支持STOMP協(xié)議的一部分命令,像 acks 、 receipts 命令都是不支持的,還有

    2024年02月09日
    瀏覽(24)
  • WebSocket的那些事(5-Spring STOMP支持之連接外部消息代理)

    WebSocket的那些事(5-Spring STOMP支持之連接外部消息代理)

    上節(jié)我們?cè)?WebSocket的那些事(4-Spring中的STOMP支持詳解) 中詳細(xì)說(shuō)明了通過(guò) Spring內(nèi)置消息代理 結(jié)合 STOMP 子協(xié)議進(jìn)行Websocket通信,以及相關(guān)注解的使用及原理。 但是Spring內(nèi)置消息代理會(huì)有一些限制,比如只支持STOMP協(xié)議的一部分命令,像 acks 、 receipts 命令都是不支持的,還有

    2024年02月09日
    瀏覽(19)
  • 基于STOMP協(xié)議的WebSocket消息代理和相關(guān)的安全握手處理器以及消息攔截器

    這段代碼是一個(gè)Spring配置類 WsChatConfig ,基于STOMP協(xié)議的WebSocket消息代理和相關(guān)的安全握手處理器以及消息攔截器。這個(gè)類通過(guò)實(shí)現(xiàn) WebSocketMessageBrokerConfigurer 接口來(lái)定義WebSocket通信的路由、安全握手以及消息攔截的邏輯。 核心方法詳解 configureMessageBroker(MessageBrokerRegistry confi

    2024年04月26日
    瀏覽(64)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包