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

Spring Boot 集成 WebSocket 實(shí)現(xiàn)服務(wù)端推送消息到客戶端

這篇具有很好參考價值的文章主要介紹了Spring Boot 集成 WebSocket 實(shí)現(xiàn)服務(wù)端推送消息到客戶端。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

? ? ? 假設(shè)有這樣一個場景:服務(wù)端的資源經(jīng)常在更新,客戶端需要盡量及時地了解到這些更新發(fā)生后展示給用戶,如果是 HTTP 1.1,通常會開啟 ajax 請求詢問服務(wù)端是否有更新,通過定時器反復(fù)輪詢服務(wù)端響應(yīng)的資源是否有更新。

websocket服務(wù)器推送,java/J2SE,spring boot,websocket,后端? ? ? ? ? ?

? ??

? ? ? ?在長時間不更新的情況下,反復(fù)地去詢問會對服務(wù)器造成很大的壓力,對網(wǎng)絡(luò)也有很大的消耗,如果定時的時間比較大,服務(wù)端有更新的話,客戶端可能需要等待定時器達(dá)到以后才能獲知,這個信息也不能很及時地獲取到。

? ? ? 而有了 WebSocket 協(xié)議,就能很好地解決這些問題,WebSocket 可以反向通知的,通常向服務(wù)端訂閱一類消息,服務(wù)端發(fā)現(xiàn)這類消息有更新就會不停地通知客戶端。

websocket服務(wù)器推送,java/J2SE,spring boot,websocket,后端

WebSocket 簡介

? ? ?WebSocket 協(xié)議是基于 TCP 的一種新的網(wǎng)絡(luò)協(xié)議,它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信—允許服務(wù)器主動發(fā)送信息給客戶端,這樣就可以實(shí)現(xiàn)從客戶端發(fā)送消息到服務(wù)器,而服務(wù)器又可以轉(zhuǎn)發(fā)消息到客戶端,這樣就能夠?qū)崿F(xiàn)客戶端之間的交互。對于 WebSocket 的開發(fā),Spring 也提供了良好的支持,目前很多瀏覽器已經(jīng)實(shí)現(xiàn)了 WebSocket 協(xié)議,但是依舊存在著很多瀏覽器沒有實(shí)現(xiàn)該協(xié)議,為了兼容那些沒有實(shí)現(xiàn)該協(xié)議的瀏覽器,往往還需要通過 STOMP 協(xié)議來完成這些兼容。

下面我們在 Spring Boot 中集成 WebSocket 來實(shí)現(xiàn)服務(wù)端推送消息到客戶端。

Spring Boot 集成 WebSocket

首先創(chuàng)建一個 Spring Boot 項(xiàng)目,然后在?pom.xml?加入如下依賴集成 WebSocket:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

開啟配置

? ? 接下來在?config?包下創(chuàng)建一個 WebSocket 配置類?WebSocketConfiguration,在配置類上加入注解?@EnableWebSocket,表明開啟 WebSocket,內(nèi)部實(shí)例化?ServerEndpointExporter?的 Bean,該 Bean 會自動注冊?@ServerEndpoint?注解聲明的端點(diǎn),代碼如下:?

@Configuration
@EnableWebSocket
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

?編寫端點(diǎn)服務(wù)類

? ? 接下來使用?@ServerEndpoint?定義一個端點(diǎn)服務(wù)類,在端點(diǎn)服務(wù)類中,可以定義 WebSocket 的打開、關(guān)閉、錯誤和發(fā)送消息的方法,具體代碼如下所示:

package worn.xiao.riskmsg.service;

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

@ServerEndpoint("/websocket/{userId}")
@Component
public class WebSocketServer {

    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

    /**
     * 當(dāng)前在線連接數(shù)
     */
    private static AtomicInteger onlineCount = new AtomicInteger(0);

    /**
     * 用來存放每個客戶端對應(yīng)的 WebSocketServer 對象
     */
    private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();

    /**
     * 與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
     */
    private Session session;

    /**
     * 接收 userId
     */
    private String userId = "";

    /**
     * 連接建立成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        this.userId = userId;
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            webSocketMap.put(userId, this);
        } else {
            webSocketMap.put(userId, this);
            addOnlineCount();
        }
        log.info("用戶連接:" + userId + ",當(dāng)前在線人數(shù)為:" + getOnlineCount());
        try {
            sendMessage("連接成功!");
        } catch (IOException e) {
            log.error("用戶:" + userId + ",網(wǎng)絡(luò)異常!!!!!!");
        }
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            subOnlineCount();
        }
        log.info("用戶退出:" + userId + ",當(dāng)前在線人數(shù)為:" + getOnlineCount());
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message 客戶端發(fā)送過來的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("用戶消息:" + userId + ",報文:" + message);
        if (!StringUtils.isEmpty(message)) {
            try {
                JSONObject jsonObject = JSONObject.parseObject(message);
                jsonObject.put("fromUserId", this.userId);
                String toUserId = jsonObject.getString("toUserId");
                if (!StringUtils.isEmpty(toUserId) && webSocketMap.containsKey(toUserId)) {
                    webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());
                } else {
                    log.error("請求的 userId:" + toUserId + "不在該服務(wù)器上");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 發(fā)生錯誤時調(diào)用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用戶錯誤:" + this.userId + ",原因:" + error.getMessage());
        error.printStackTrace();
    }

    /**
     * 實(shí)現(xiàn)服務(wù)器主動推送
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    public static synchronized AtomicInteger getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount.getAndIncrement();
    }

    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount.getAndDecrement();
    }
}

其中,@ServerEndpoint("/websocket/{userId}")表示讓 Spring 創(chuàng)建 WebSocket 的服務(wù)端點(diǎn),其中請求地址是?/websocket/{userId}。

另外 WebSocket 一共有四個事件,分別對應(yīng) JSR-356 定義的?@OnOpen、@OnMessage、@OnClose、@OnError?注解。

  • @OnOpen:標(biāo)注客戶端打開 WebSocket 服務(wù)端點(diǎn)調(diào)用方法
  • @OnClose:標(biāo)注客戶端關(guān)閉 WebSocket 服務(wù)端點(diǎn)調(diào)用方法
  • @OnMessage:標(biāo)注客戶端發(fā)送消息,WebSocket 服務(wù)端點(diǎn)調(diào)用方法
  • @OnError:標(biāo)注客戶端請求 WebSocket 服務(wù)端點(diǎn)發(fā)生異常調(diào)用方法

接下來啟動項(xiàng)目,使用 WebSocket 在線測試工具(http://www.easyswoole.com/wstool.html)進(jìn)行測試,有能力的也可以自己寫個 html 測試。

打開網(wǎng)頁后,在服務(wù)地址中輸入ws://127.0.0.1:8088/websocket/xiaozhengwen,點(diǎn)擊開啟連接按鈕,消息記錄中會多一條由服務(wù)器端發(fā)送的連接成功!記錄。

接下來再打開一個網(wǎng)頁,服務(wù)地址中輸入ws://127.0.0.1:8088/websocket/yangdandan,點(diǎn)擊開啟連接按鈕,然后回到第一次打開的網(wǎng)頁在消息框中輸入

{
? "fromUserId":"xiaozhengwen",
? "toUserId":"yangdandan",
? ?"msg":"吃過飯了嗎"
}

點(diǎn)擊發(fā)送到服務(wù)端,第二個網(wǎng)頁中會收到服務(wù)端推送的消息

{ 
  "fromUserId":"yangdandan", 
  "toUserId":"xiaozhengwen", 
  "msg":"吃過了" 
}

?websocket服務(wù)器推送,java/J2SE,spring boot,websocket,后端

?同樣,項(xiàng)目的日志中也會有相應(yīng)的日志:

2023-06-30 12:40:48.894  INFO 78908 --- [nio-8080-exec-1] com.wupx.server.WebSocketServer          : 用戶連接:wupx,當(dāng)前在線人數(shù)為:1
2023-06-30 12:40:58.073  INFO 78908 --- [nio-8080-exec-2] com.wupx.server.WebSocketServer          : 用戶連接:huxy,當(dāng)前在線人數(shù)為:2
2023-06-30 12:41:05.870  INFO 78908 --- [nio-8080-exec-3] com.wupx.server.WebSocketServer          : 用戶消息:wupx,報文:{"toUserId":"huxy","message":"i love you"}

總結(jié)

? ? 本文簡單地介紹了 Spring Boot 集成 WebSocket 實(shí)現(xiàn)服務(wù)端主動推送消息到客戶端,是不是十分簡單呢?大家可以自己也寫個 demo 試試!文章來源地址http://www.zghlxwxcb.cn/news/detail-597236.html

到了這里,關(guān)于Spring Boot 集成 WebSocket 實(shí)現(xiàn)服務(wù)端推送消息到客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Springboot集成websocket實(shí)現(xiàn)消息推送和在線用戶統(tǒng)計(jì)

    Springboot集成websocket實(shí)現(xiàn)消息推送和在線用戶統(tǒng)計(jì)

    在啟動類上添加一個bean 核心代碼 實(shí)現(xiàn)消息推送只要在業(yè)務(wù)代碼中調(diào)用sendMessageSpecial()方法即可。 然后調(diào)用剛才的業(yè)務(wù)接口測試:http://localhost:8080/websocket/t1 調(diào)用成功后可以看到三個窗口中都收到了消息

    2023年04月08日
    瀏覽(26)
  • WebSocket+Redis實(shí)現(xiàn)消息推送機(jī)制以及離線消息推送(vue+sping boot)

    vue端涉及業(yè)務(wù)就不貼了 WebSocket 是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在

    2024年02月09日
    瀏覽(53)
  • SpringBoot集成WebSocket實(shí)現(xiàn)消息實(shí)時推送(提供Gitee源碼)

    前言:在最近的工作當(dāng)中,客戶反應(yīng)需要實(shí)時接收消息提醒,這個功能雖然不大,但不過也用到了一些新的技術(shù),于是我這邊寫一個關(guān)于我如何實(shí)現(xiàn)這個功能、編寫、測試到部署服務(wù)器,歸納到這篇博客中進(jìn)行總結(jié)。 目錄 一、什么是WebSocket 二、后端實(shí)現(xiàn) 2.1、引入pom.xml依賴

    2024年02月11日
    瀏覽(24)
  • Spring Boot 最新版3.x 集成 OAuth 2.0實(shí)現(xiàn)認(rèn)證授權(quán)服務(wù)、第三方應(yīng)用客戶端以及資源服務(wù)

    Spring Boot 最新版3.x 集成 OAuth 2.0實(shí)現(xiàn)認(rèn)證授權(quán)服務(wù)、第三方應(yīng)用客戶端以及資源服務(wù)

    Spring Boot 3 已經(jīng)發(fā)布一段時間,網(wǎng)上關(guān)于 Spring Boot 3 的資料不是很多,本著對新技術(shù)的熱情,學(xué)習(xí)和研究了大量 Spring Boot 3 新功能和新特性,感興趣的同學(xué)可以參考 Spring 官方資料全面詳細(xì)的新功能/新改進(jìn)介紹 Spring 版本升級到6.x JDK版本至少17+ … 新特性有很多,本文主要針對

    2024年02月02日
    瀏覽(97)
  • WebSocket服務(wù)端數(shù)據(jù)推送及心跳機(jī)制(Spring Boot + VUE)

    WebSocket服務(wù)端數(shù)據(jù)推送及心跳機(jī)制(Spring Boot + VUE)

    一、WebSocket簡介 HTML5規(guī)范在傳統(tǒng)的web交互基礎(chǔ)上為我們帶來了眾多的新特性,隨著web技術(shù)被廣泛用于web APP的開發(fā),這些新特性得以推廣和使用,而websocket作為一種新的web通信技術(shù)具有巨大意義。WebSocket是HTML5新增的協(xié)議,它的目的是在瀏覽器和服務(wù)器之間建立一個不受限的雙

    2024年02月12日
    瀏覽(25)
  • 使用HTTP/2實(shí)現(xiàn)服務(wù)端主動推送消息給客戶端

    使用HTTP/2實(shí)現(xiàn)服務(wù)端主動推送消息給客戶端

    77. 使用HTTP/2實(shí)現(xiàn)服務(wù)端主動推送消息給客戶端 HTTP/2 協(xié)議的服務(wù)器主動推送機(jī)制是通過服務(wù)器在接收到客戶端請求后,主動向客戶端推送相關(guān)資源的方式來實(shí)現(xiàn)的。下面將詳細(xì)解釋如何在服務(wù)器端和客戶端實(shí)現(xiàn) HTTP/2 的服務(wù)器主動推送,并給出相應(yīng)的代碼示例。 客戶端實(shí)現(xiàn):

    2024年02月11日
    瀏覽(31)
  • 【Java】SpringBoot快速整合WebSocket實(shí)現(xiàn)客戶端服務(wù)端相互推送信息

    【Java】SpringBoot快速整合WebSocket實(shí)現(xiàn)客戶端服務(wù)端相互推送信息

    目錄 什么是webSocket? webSocket可以用來做什么? WebSocket操作類 一:測試客戶端向服務(wù)端推送消息 1.啟動SpringBoot項(xiàng)目 2.打開網(wǎng)站 3.進(jìn)行測試消息推送 4.后端進(jìn)行查看測試結(jié)果 二:測試服務(wù)端向客戶端推送消息 1.接口代碼 2.使用postman進(jìn)行調(diào)用 3.查看測試結(jié)果 ????????WebSocke

    2024年01月20日
    瀏覽(37)
  • 在Spring Boot微服務(wù)集成Kafka客戶端(spring-kafka)操作Kafka

    記錄 :457 場景 :在Spring Boot微服務(wù)集成Kafka客戶端spring-kafka-2.8.2操作Kafka。使用Spring封裝的KafkaTemplate操作Kafka生產(chǎn)者Producer。使用Spring封裝的@KafkaListener操作Kafka的消費(fèi)者Consumer。 版本 :JDK 1.8,Spring?Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka安裝 :https://blog.csdn.net/zhangbeizhen1

    2024年02月09日
    瀏覽(92)
  • springboot集成webstock實(shí)戰(zhàn):服務(wù)端數(shù)據(jù)推送數(shù)據(jù)到客戶端實(shí)現(xiàn)實(shí)時刷新

    springboot集成webstock實(shí)戰(zhàn):服務(wù)端數(shù)據(jù)推送數(shù)據(jù)到客戶端實(shí)現(xiàn)實(shí)時刷新

    ????之前介紹過springboot集成webstock方式,具體參考: springboot集成websocket實(shí)戰(zhàn):站內(nèi)消息實(shí)時推送 這里補(bǔ)充另外一個使用webstock的場景,方便其他同學(xué)理解和使用,廢話不多說了,直接開始!簡單介紹一下業(yè)務(wù)場景: ????現(xiàn)在有一個投票活動,活動詳情中會顯示投票活動的參與人數(shù)、訪

    2024年02月08日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包