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

WebSocket實現(xiàn)前后端消息推送

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

WebSocket的代碼編寫會根據(jù)業(yè)務(wù)邏輯而進(jìn)行變化,需要去理解編寫思路,這樣才能在工作中使用得游刃有余。

1. 引入依賴

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

2.? 編寫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 getServerEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

3. 編寫WebSocket服務(wù)類

下面的服務(wù)類中,可以編寫多個sendMeg方法(寫法比較多樣化),作用是發(fā)送消息回前端,使用方式就是你在自己的業(yè)務(wù)代碼中自行調(diào)用,例(serviceImpl中調(diào)用):文章來源地址http://www.zghlxwxcb.cn/news/detail-508119.html

WebSocketServer.sendCountToUaa(ownerId, unreadNewsCount);
import com.sms.service.InternalNewsService;
import com.sms.service.impl.InternalNewsServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Websocket服務(wù),推送信息
 */

@Slf4j
@Component
@ServerEndpoint("/webSocket/sms")
public class WebSocketServer {

    /**
     * 定義集合,用于存儲連接信息
     * 根據(jù)業(yè)務(wù)需求自定義,數(shù)據(jù)格式可隨意變化
     */
    //瀏覽器端連接,這種數(shù)據(jù)格式是因為考慮到同一個用戶賬號可以在不同的瀏覽器登錄,所以一個用戶需要保存多個連接
    private static final ConcurrentHashMap<String, ArrayList<Session>> sessionMap = new ConcurrentHashMap<>();
    //微信端連接
    private static final List<Session> wxSessionList = new ArrayList<>();

    /**
     * 作用:
     * 這里使用@Autowared是無法正常注入對象的,需要注入外部對象就需要使用這種方式
     * 需在啟動類也就是main方法中加入:WebSocketServer.setApplicationContext(context);
     * context參數(shù)是啟動類中run方法的返回值
     * 使用:
     * 在需要對象的地方使用
     * 例:
     * UserServiceImpl userServiceImpl = applicationContext.getBean(UserService.class);
     */
    private static ApplicationContext applicationContext;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        WebSocketServer.applicationContext = applicationContext;
    }

    /**
     * 前端關(guān)閉頁面或者主動關(guān)閉websocket鏈接,都會執(zhí)行@OnClose
     */
    @OnClose
    public void close(Session session) {
        if (null == session) {
            return;
        }
        /**
         * 以下代碼都是根據(jù)業(yè)務(wù)邏輯編寫,寫法并不固定
         */
        //關(guān)閉微信端中的session
        ListIterator<Session> sessionListIterator = wxSessionList.listIterator();
        while (sessionListIterator.hasNext()) {
            Session next = sessionListIterator.next();
            if (session == next) {
                sessionListIterator.remove();
                return;
            }
        }
        //關(guān)閉瀏覽器端中的session
        Iterator<Map.Entry<String, ArrayList<Session>>> iterator = sessionMap.entrySet().iterator();
        while (iterator.hasNext()) {
            ArrayList<Session> values = iterator.next().getValue();
            if (null == values || 1 > values.size()) {
                continue;
            }
            for (int i = 0; i < values.size(); i++) {
                Session sess = values.get(i);
                if (null == sess) {
                    continue;
                }
                if (session == sess) {
                    values.remove(i--);
                    return;
                }
            }
        }
    }

    /**
     * 前端連接后端socket時執(zhí)行@OnMessage,前后端建立起連接,后端保存連接
     */
    @OnMessage
    public void onMessage(String userId, Session session) {
        if (StringUtils.isEmpty(userId) || null == session) {
            return;
        }
        if ("ykj".equals(userId)) {
            //微信端消息標(biāo)識,自定義,沒有微信端可直接將這個if刪掉
            wxSessionList.add(session);
        } else {
            //接收到消息后,找到對應(yīng)的session
            ArrayList<Session> sessions = sessionMap.get(userId);
            if (null == sessions) {
                sessions = new ArrayList<>();
            } else {
                //遍歷,看該session是否存在,如果存在代表是在心跳檢測操作
                for (int i = 0; i < sessions.size(); i++) {
                    if (sessions.get(i) == session) {
                        try {
                            //發(fā)送消息回前端
                            session.getAsyncRemote().sendText("{\"heartbeat\":\"socket心跳檢測成功!??!\"}");
                            return;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            //說明session不存在,添加到列表
            sessions.add(session);
            sessionMap.put(userId, sessions);

            //查詢當(dāng)前用戶未讀消息條數(shù)(業(yè)務(wù)代碼,查詢數(shù)據(jù)庫)
            InternalNewsService internalNewsService = applicationContext.getBean(InternalNewsService.class);
            Integer newsCount = internalNewsService.selectUnreadNewsCount(userId, 0, 4);

            if (newsCount == null) {
                session.getAsyncRemote().sendText("0");//發(fā)送消息回前端
            } else {
                session.getAsyncRemote().sendText(newsCount.toString());//發(fā)送消息回前端
            }
            return;
        }
        try {
            session.getAsyncRemote().sendText("200");//發(fā)送消息回前端
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 發(fā)送數(shù)據(jù)到前端
     *
     * @param msg
     */
    public static void sendMsg(String userIds, String msg) {
        if (StringUtils.isEmpty(userIds) || StringUtils.isEmpty(msg)) {
            return;
        }
        String[] user_id = userIds.split(",");
        int uis = user_id.length;
        if (1 > uis) {
            return;
        }
        for (int ii = 0; ii < uis; ii++) {
            String userId = user_id[ii];
            if (StringUtils.isEmpty(userId)) {
                continue;
            }
            ArrayList<Session> sessions = sessionMap.get(userId);
            if (null == sessions || 1 > sessions.size()) {
                continue;
            }
            Iterator<Session> iterator = sessions.iterator();
            while (iterator.hasNext()) {
                Session next = iterator.next();
                if (null == next || !next.isOpen()) {
                    continue;
                }
                try {
                    next.getBasicRemote().sendText(msg);
                    //System.out.println("推送給socket:" + next);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 發(fā)送數(shù)據(jù)到前端uaa端
     */
    public static void sendCountToUaa(String userId, Integer count) {
        if (StringUtils.isEmpty(userId)) {
            return;
        }
        ArrayList<Session> sessions = sessionMap.get(userId);
        if (null == sessions || 1 > sessions.size()) {
            return;
        }
        Iterator<Session> iterator = sessions.iterator();
        while (iterator.hasNext()) {
            Session next = iterator.next();
            if (null == next || !next.isOpen()) {
                continue;
            }
            try {
                //next.getBasicRemote().sendText(count.toString());
                next.getAsyncRemote().sendText(count.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 給微信端用戶推送消息
     *
     * @param msg
     */
    public static void sendToVXMsg(String msg) {
        ListIterator<Session> sessionListIterator = wxSessionList.listIterator();
        while (sessionListIterator.hasNext()) {
            Session session = sessionListIterator.next();
            try {
                session.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

到了這里,關(guān)于WebSocket實現(xiàn)前后端消息推送的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot+Netty+Websocket實現(xiàn)消息推送

    SpringBoot+Netty+Websocket實現(xiàn)消息推送

    這樣一個需求:把設(shè)備異常的狀態(tài)每10秒推送到頁面并且以彈窗彈出來,這個時候用Websocket最為合適,今天主要是后端代碼展示。 添加依賴 定義netty端口號 netty服務(wù)器 Netty配置 管理全局Channel以及用戶對應(yīng)的channel(推送消息) 管道配置 自定義CustomChannelHandler 推送消息接口及

    2024年02月04日
    瀏覽(19)
  • WebSocket+Redis實現(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整合Netty+Websocket實現(xiàn)消息推送

    ? ? ? ?Netty是一個高性能、異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端。以下是Netty的主要優(yōu)勢: 高性能 :Netty基于NIO(非阻塞IO)模型,采用事件驅(qū)動的設(shè)計,具有高性能的特點。它通過零拷貝技術(shù)、內(nèi)存池化技術(shù)等手段,進(jìn)一步提高

    2024年01月20日
    瀏覽(21)
  • Spring Boot集成WebSocket實現(xiàn)消息推送

    Spring Boot集成WebSocket實現(xiàn)消息推送

    項目中經(jīng)常會用到消息推送功能,關(guān)于推送技術(shù)的實現(xiàn),我們通常會聯(lián)想到輪詢、comet長連接技術(shù),雖然這些技術(shù)能夠?qū)崿F(xiàn),但是需要反復(fù)連接,對于服務(wù)資源消耗過大,隨著技術(shù)的發(fā)展,HtML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進(jìn)行通訊。

    2023年04月08日
    瀏覽(21)
  • Vue使用WebSocket實現(xiàn)實時獲取后端推送的數(shù)據(jù)。

    Vue可以使用WebSocket實現(xiàn)實時獲取后端推送的數(shù)據(jù)。 1.在Vue項目中安裝WebSocket庫 可以使用npm或yarn安裝WebSocket庫: 2.創(chuàng)建WebSocket連接 在Vue組件中創(chuàng)建WebSocket連接,連接到后端WebSocket服務(wù)器,代碼如下: 上面的代碼中,使用WebSocket連接到后端WebSocket服務(wù)器,通過監(jiān)聽onmessage事件,

    2024年02月08日
    瀏覽(26)
  • 分布式WebSocket消息推送系統(tǒng)設(shè)計與實現(xiàn)

    作者:禪與計算機(jī)程序設(shè)計藝術(shù) 現(xiàn)如今,隨著物聯(lián)網(wǎng)、云計算、移動互聯(lián)網(wǎng)、大數(shù)據(jù)等新技術(shù)的興起,分布式系統(tǒng)成為越來越多企業(yè)面臨的挑戰(zhàn)。在分布式系統(tǒng)中,服務(wù)間通信是一個重要且復(fù)雜的課題,基于TCP/IP協(xié)議族的傳輸層協(xié)議之上的應(yīng)用層協(xié)議比如HTTP協(xié)議、RPC(Remo

    2024年02月05日
    瀏覽(25)
  • Springboot整合WebSocket實現(xiàn)主動向前端推送消息

    Springboot整合WebSocket實現(xiàn)主動向前端推送消息

    ? ? ? ? 在上篇文章tcp編程中,我們實現(xiàn)了C++客戶端與java服務(wù)器之間的通信,客戶端發(fā)送了一個消息給服務(wù)器,今天我們要實現(xiàn)基于WebSocket實現(xiàn)服務(wù)器主動向前端推送消息,并且以服務(wù)器接收到C++客戶端的消息主動向前端推送消息的觸發(fā)條件。 WebSocket 的誕生背景 ??????

    2024年03月16日
    瀏覽(23)
  • Springboot集成websocket實現(xiàn)消息推送和在線用戶統(tǒng)計

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

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

    2023年04月08日
    瀏覽(26)
  • 記錄--你還在使用websocket實現(xiàn)實時消息推送嗎?

    記錄--你還在使用websocket實現(xiàn)實時消息推送嗎?

    在日常的開發(fā)中,我們經(jīng)常能碰見服務(wù)端需要主動推送給客戶端數(shù)據(jù)的業(yè)務(wù)場景,比如數(shù)據(jù)大屏的實時數(shù)據(jù),比如消息中心的未讀消息,比如聊天功能等等。 本文主要介紹SSE的使用場景和如何使用SSE。 我們常規(guī)實現(xiàn)這些需求的方案有以下三種 輪詢 websocket SSE 在很久很久以前

    2024年02月19日
    瀏覽(25)
  • Golang 搭建 WebSocket 應(yīng)用(三) - 實現(xiàn)一個消息推送中心

    Golang 搭建 WebSocket 應(yīng)用(三) - 實現(xiàn)一個消息推送中心

    有了前兩篇的鋪墊,相信大家已經(jīng)對 Golang 中 WebSocket 的使用有一定的了解了, 今天我們以一個更加真實的例子來學(xué)習(xí)如何在 Golang 中使用 WebSocket 。 在實際的項目中,往往有一些任務(wù)耗時比較長,然后我們會把這些任務(wù)做異步的處理,但是又要及時給客戶端反饋任務(wù)的處理進(jìn)

    2024年01月23日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包