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

websockets-后端主動(dòng)向前端推送消息

這篇具有很好參考價(jià)值的文章主要介紹了websockets-后端主動(dòng)向前端推送消息。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

WebSocket–入門

公司領(lǐng)導(dǎo)提出了一個(gè)新的需求,那就是部門主管在有審批消息的情況下,需要看到提示消息。其實(shí)這種需求最簡(jiǎn)單的方法使接入短信、郵件、公眾號(hào)平臺(tái)。直接推送消息。但是,由于使自研項(xiàng)目,公司領(lǐng)導(dǎo)不想花錢,只能另辟蹊徑。

WebSocket簡(jiǎn)介

WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信,即允許服務(wù)器主動(dòng)發(fā)送信息給客戶端。因此,在WebSocket中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸,客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單。

WebSocket-實(shí)現(xiàn)后端推送消息給前端

依賴導(dǎo)入

<!-- 該依賴包含 SpringBoot starer 無需重復(fù)導(dǎo)入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.7.0</version>
</dependency>
<!-- 除此之外我們還需要lombok 和 fastjson -->
<!-- 這里就不導(dǎo)入了 -->

代碼實(shí)現(xiàn)

WebSocketConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
WebSocketMessage–封裝的消息結(jié)果類(非必須)
import lombok.Data;

@Data
public class NoticeWebsocketResp<T> {

    private String noticeType;

    private T noticeInfo;

}
WebSocketServer
import com.alibaba.fastjson.JSONObject;
import com.mydemo.websocketdemo.domain.NoticeWebsocketResp;
import lombok.extern.slf4j.Slf4j;
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.util.*;
import java.util.concurrent.ConcurrentHashMap;


@ServerEndpoint("/notice/{userId}")
@Component
@Slf4j
public class NoticeWebsocket {
    //記錄連接的客戶端
    public static Map<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * userId關(guān)聯(lián)sid(解決同一用戶id,在多個(gè)web端連接的問題)
     */
    public static Map<String, Set<String>> conns = new ConcurrentHashMap<>();

    private String sid = null;

    private String userId;


    /**
     * 連接成功后調(diào)用的方法
     * @param session
     * @param userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.sid = UUID.randomUUID().toString();
        this.userId = userId;
        clients.put(this.sid, session);

        Set<String> clientSet = conns.get(userId);
        if (clientSet==null){
            clientSet = new HashSet<>();
            conns.put(userId,clientSet);
        }
        clientSet.add(this.sid);
        log.info(this.sid + "連接開啟!");
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        log.info(this.sid + "連接斷開!");
        clients.remove(this.sid);
    }

    /**
     * 判斷是否連接的方法
     * @return
     */
    public static boolean isServerClose() {
        if (NoticeWebsocket.clients.values().size() == 0) {
            log.info("已斷開");
            return true;
        }else {
            log.info("已連接");
            return false;
        }
    }

    /**
     * 發(fā)送給所有用戶
     * @param noticeType
     */
    public static void sendMessage(String noticeType){
        NoticeWebsocketResp noticeWebsocketResp = new NoticeWebsocketResp();
        noticeWebsocketResp.setNoticeType(noticeType);
        sendMessage(noticeWebsocketResp);
    }


    /**
     * 發(fā)送給所有用戶
     * @param noticeWebsocketResp
     */
    public static void sendMessage(NoticeWebsocketResp noticeWebsocketResp){
        String message = JSONObject.toJSONString(noticeWebsocketResp);
        for (Session session1 : NoticeWebsocket.clients.values()) {
            try {
                session1.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 根據(jù)用戶id發(fā)送給某一個(gè)用戶
     * **/
    public static void sendMessageByUserId(String userId, NoticeWebsocketResp noticeWebsocketResp) {
        if (!StringUtils.isEmpty(userId)) {
            String message = JSONObject.toJSONString(noticeWebsocketResp);
            Set<String> clientSet = conns.get(userId);
            if (clientSet != null) {
                Iterator<String> iterator = clientSet.iterator();
                while (iterator.hasNext()) {
                    String sid = iterator.next();
                    Session session = clients.get(sid);
                    if (session != null) {
                        try {
                            session.getBasicRemote().sendText(message);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到來自窗口"+this.userId+"的信息:"+message);
    }

    /**
     * 發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)
     * @param error
     */
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
    }

}

這樣我們就配置好了websocket

測(cè)試準(zhǔn)備
訪問接口–當(dāng)請(qǐng)求該接口時(shí),主動(dòng)推送消息
import com.mydemo.websocketdemo.domain.NoticeWebsocketResp;
import com.mydemo.websocketdemo.websocketserver.NoticeWebsocket;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
public class OrderController {
    @GetMapping("/test")
    public String test() {
        NoticeWebsocket.sendMessage("你好,WebSocket");
        return "ok";
    }

    @GetMapping("/test1")
    public String test1() {
        NoticeWebsocketResp noticeWebsocketResp = new NoticeWebsocketResp();
        noticeWebsocketResp.setNoticeInfo("米奇妙妙屋");
        NoticeWebsocket.sendMessageByUserId("1", noticeWebsocketResp);
        return "ok";
    }
}
springboot啟動(dò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);
    }
}
前端測(cè)試頁(yè)面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SseEmitter</title>
</head>
<body>
<div id="message"></div>
</body>
<script>
var limitConnect = 0;
init();
function init() {
// 8080未默認(rèn)端口,可自行替換    
var ws = new WebSocket('ws://localhost:8080/notice/2');
// 獲取連接狀態(tài)
console.log('ws連接狀態(tài):' + ws.readyState);
//監(jiān)聽是否連接成功
ws.onopen = function () {
    console.log('ws連接狀態(tài):' + ws.readyState);
    limitConnect = 0;
    //連接成功則發(fā)送一個(gè)數(shù)據(jù)
    ws.send('我們建立連接啦');
}
// 接聽服務(wù)器發(fā)回的信息并處理展示
ws.onmessage = function (data) {
    console.log('接收到來自服務(wù)器的消息:');
    console.log(data);
    //完成通信后關(guān)閉WebSocket連接
    // ws.close();
}
// 監(jiān)聽連接關(guān)閉事件
ws.onclose = function () {
    // 監(jiān)聽整個(gè)過程中websocket的狀態(tài)
    console.log('ws連接狀態(tài):' + ws.readyState);
reconnect();

}
// 監(jiān)聽并處理error事件
ws.onerror = function (error) {
    console.log(error);
}
}
function reconnect() {
    limitConnect ++;
    console.log("重連第" + limitConnect + "次");
    setTimeout(function(){
        init();
    },2000);
   
}
</script>
</html>

之后用瀏覽器打開html頁(yè)面,顯示如下:

websocket服務(wù)端主動(dòng)推送,前端,java

連接成功

調(diào)用接口

localhost:8080/order/test

websocket服務(wù)端主動(dòng)推送,前端,java
證明后端推送消息給前端成功文章來源地址http://www.zghlxwxcb.cn/news/detail-696259.html

到了這里,關(guān)于websockets-后端主動(dòng)向前端推送消息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • 前端訂閱后端推送WebSocket定時(shí)任務(wù)

    前端訂閱后端推送WebSocket定時(shí)任務(wù)

    ? ? ? ? 后端定時(shí)向前端看板推送數(shù)據(jù),每10秒或者30秒推送一次。 ????????HTTP協(xié)議是一個(gè)應(yīng)用層協(xié)議,它的特點(diǎn)是無狀態(tài)、無連接和單向的。在HTTP協(xié)議中,客戶端發(fā)起請(qǐng)求,服務(wù)器則對(duì)請(qǐng)求進(jìn)行響應(yīng)。這種請(qǐng)求-響應(yīng)的模式意味著服務(wù)器無法主動(dòng)向客戶端發(fā)送消息。 ??

    2024年04月25日
    瀏覽(21)
  • Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

    Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

    后端向前端推送信息,通知任務(wù)完成 輪詢 SSE WebSocket 請(qǐng)求方式 HTTP HTTP TCP長(zhǎng)連接 觸發(fā)方式 輪詢 事件 事件 優(yōu)點(diǎn) 實(shí)現(xiàn)簡(jiǎn)單易兼容 實(shí)現(xiàn)簡(jiǎn)單開發(fā)成本低 全雙工通信,開銷小,安全,可擴(kuò)展 缺點(diǎn) 消耗較大 不兼容IE 傳輸數(shù)據(jù)需二次解析,開發(fā)成本大 適用場(chǎng)景 服務(wù)端向客戶端單向

    2023年04月19日
    瀏覽(50)
  • 前端實(shí)現(xiàn)消息推送、即時(shí)通信、SSE、WebSocket、http簡(jiǎn)介

    前端實(shí)現(xiàn)消息推送、即時(shí)通信、SSE、WebSocket、http簡(jiǎn)介

    服務(wù)端主動(dòng)向客戶端推送消息,使客戶端能夠即時(shí)接收到信息。 場(chǎng)景 頁(yè)面接收到點(diǎn)贊,消息提醒 聊天功能 彈幕功能 實(shí)時(shí)更新數(shù)據(jù)功能 短輪詢 瀏覽器(客戶端)每隔一段時(shí)間向服務(wù)器發(fā)送http請(qǐng)求,服務(wù)器端在收到請(qǐng)求后,不論是否有數(shù)據(jù)更新,都直接進(jìn)行響應(yīng)。 本質(zhì):客

    2024年02月16日
    瀏覽(18)
  • gateway管理websocket長(zhǎng)連接服務(wù),消息推送

    gateway管理websocket長(zhǎng)連接服務(wù),消息推送

    目前業(yè)務(wù)需要長(zhǎng)連接進(jìn)行實(shí)時(shí)數(shù)據(jù)交互,同時(shí)已有的業(yè)務(wù)系統(tǒng)統(tǒng)一經(jīng)過gateway網(wǎng)關(guān)調(diào)度,websocket服務(wù)是有狀態(tài)服務(wù),所以希望集成到同一個(gè)注冊(cè)中心讓gateway進(jìn)行長(zhǎng)連接的負(fù)載均衡轉(zhuǎn)發(fā)和管理,以此寫個(gè)demo進(jìn)行測(cè)試 提供http請(qǐng)求api和長(zhǎng)連接進(jìn)行消息發(fā)送 ?首先連接需要登錄后獲

    2023年04月13日
    瀏覽(22)
  • Spring Boot 集成 WebSocket 實(shí)現(xiàn)服務(wù)端推送消息到客戶端

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

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

    2024年02月16日
    瀏覽(86)
  • Java:SpringBoot整合WebSocket實(shí)現(xiàn)服務(wù)端向客戶端推送消息

    Java:SpringBoot整合WebSocket實(shí)現(xiàn)服務(wù)端向客戶端推送消息

    思路: 后端通過websocket向前端推送消息,前端統(tǒng)一使用http協(xié)議接口向后端發(fā)送數(shù)據(jù) 本文僅放一部分重要的代碼,完整代碼可參看github倉(cāng)庫(kù) websocket 前端測(cè)試 :http://www.easyswoole.com/wstool.html 依賴 項(xiàng)目目錄 完整依賴 配置 WebSocketServer.java 前端頁(yè)面 websocket.html 前端邏輯 index.js 參

    2024年02月04日
    瀏覽(29)
  • WebSocket與消息推送

    WebSocket與消息推送

    B/S結(jié)構(gòu)的軟件項(xiàng)目中有時(shí)客戶端需要實(shí)時(shí)的獲得服務(wù)器消息,但默認(rèn)HTTP協(xié)議只支持請(qǐng)求響應(yīng)模式,這樣做可以簡(jiǎn)化Web服務(wù)器,減少服務(wù)器的負(fù)擔(dān),加快響應(yīng)速度,因?yàn)榉?wù)器不需要與客戶端長(zhǎng)時(shí)間建立一個(gè)通信鏈接,但不容易直接完成實(shí)時(shí)的消息推送功能,如聊天室、后臺(tái)信

    2024年02月13日
    瀏覽(21)
  • WebSocket實(shí)現(xiàn)前后端消息推送

    WebSocket的代碼編寫會(huì)根據(jù)業(yè)務(wù)邏輯而進(jìn)行變化,需要去理解編寫思路,這樣才能在工作中使用得游刃有余。 1. 引入依賴 2.? 編寫WebSocketConfig配置類 3. 編寫WebSocket服務(wù)類 下面的服務(wù)類中,可以編寫多個(gè)sendMeg方法(寫法比較多樣化),作用是發(fā)送消息回前端,使用方式就是你在自

    2024年02月11日
    瀏覽(27)
  • SpringBoot集成WebSocket(實(shí)時(shí)消息推送)

    SpringBoot集成WebSocket(實(shí)時(shí)消息推送)

    ?? 簡(jiǎn)介:java系列技術(shù)分享(??持續(xù)更新中…??) ?? 初衷:一起學(xué)習(xí)、一起進(jìn)步、堅(jiān)持不懈 ?? 如果文章內(nèi)容有誤與您的想法不一致,歡迎大家在評(píng)論區(qū)指正?? ?? 希望這篇文章對(duì)你有所幫助,歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? ?? 更多文章請(qǐng)點(diǎn)擊 調(diào)試工具 :http://coolaf.com/tool/chatt

    2024年04月29日
    瀏覽(25)
  • Vue-全局websocket 實(shí)現(xiàn)消息推送

    ?在上一篇文章? WebSocket 消息推送 https://blog.csdn.net/qq_63312957/article/details/125375122?spm=1001.2014.3001.5502 ?中已經(jīng)簡(jiǎn)單描述了如何使用 springboot? vue websocket 實(shí)現(xiàn)數(shù)據(jù)推送,建議先閱讀之前的文章之后,再來閱讀本篇文章。 新建global.js文件 一:main.js 文件中增加 ?二:app.vue中添加

    2024年02月16日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包