欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合websocket實現(xiàn)群聊思路代碼詳解

 更新時間:2021年05月28日 15:05:11   作者:叁滴水  
通過springboot引入websocket,實現(xiàn)群聊,通過在線websocket測試進行展示。本文重點給大家介紹springboot整合websocket實現(xiàn)群聊功能,代碼超級簡單,感興趣的朋友跟隨小編一起學習吧

實現(xiàn)思路

image-20210528112407993

發(fā)送者向服務器發(fā)送大家早上好。其它客戶端可以收到對應消息。

項目展示

image-20210528111445032

通過springboot引入websocket,實現(xiàn)群聊,通過在線websocket測試進行展示。

核心代碼

pom引入jar

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

使用springboot 2.3.10.RELEASE版本;java8

WebSocketConfig配置類

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

websocket有4個注解,解釋如下

  • @OnOpen 有新連接
  • @OnMessage 有新消息時
  • @OnClose 關(guān)閉連接
  • @OnError 連接異常

對于這個4個注解,配置在方法上即可。

WebsocketServerEndpoint接收類

@Slf4j
@Controller
@ServerEndpoint ("/")
public class WebsocketServerEndpoint
{
   @OnOpen
   public void onOpen(Session session, EndpointConfig config) {
      log.info("[onOpen][session({}) 接入]", session);
      WebSocketUtil.broadcast (session.getId ()+"上線了");
      WebSocketUtil.addSession (session);
   }
   @OnMessage
   public void onMessage(Session session, String message) {
      WebSocketUtil.broadcast (message);
      log.info("[onOpen][session({}) 接收到一條消息({})]", session, message); // 生產(chǎn)環(huán)境下,請設(shè)置成 debug 級別
   }
   @OnClose
   public void onClose(Session session, CloseReason closeReason) {
      WebSocketUtil.removeSession (session);
      WebSocketUtil.broadcast (session.getId ()+"下線了");
      log.info("[onClose][session({}) 連接關(guān)閉。關(guān)閉原因是({})}]", session, closeReason);
   }
   @OnError
   public void onError(Session session, Throwable throwable) {
      log.info("[onClose][session({}) 發(fā)生異常]", session, throwable);
   }
}

WebSocketUtil工具類

@Slf4j
public class WebSocketUtil
{


    // ========== 會話相關(guān) ==========

    /**
     * Session 與用戶的映射
     */
    private static final Map<String, Session> SESSION_USER_MAP = new ConcurrentHashMap<> ();

    /**
     * 添加 Session 。在這個方法中,會添加用戶和 Session 之間的映射
     *
     * @param session Session
     */
    public static void addSession(Session session) {
        // 更新 SESSION_USER_MAP
        SESSION_USER_MAP.put(session.getId (), session);
    }

    /**
     * 移除 Session 。
     *
     * @param session Session
     */
    public static void removeSession(Session session) {
        // 從 SESSION_USER_MAP 中移除
          SESSION_USER_MAP.remove(session.getId ());

    }

    // ========== 消息相關(guān) ==========

    /**
     * 廣播發(fā)送消息給所有在線用戶
     *
     * @param message 消息體
     * @param <T> 消息類型
     */
    public static <T extends Message> void broadcast(String message) {
        // 創(chuàng)建消息
//        String messageText = buildTextMessage(type, message);
        // 遍歷 SESSION_USER_MAP ,進行逐個發(fā)送
        for (String sessionId : SESSION_USER_MAP.keySet()) {
            sendTextMessage(SESSION_USER_MAP.get (sessionId), message);
        }
    }

    /**
     * 發(fā)送消息給單個用戶的 Session
     *
     * @param session Session
     * @param type 消息類型
     * @param message 消息體
     * @param <T> 消息類型
     */
    public static <T extends Message> void send(Session session, String type, T message) {
        // 創(chuàng)建消息
        String messageText = buildTextMessage(type, message);
        // 遍歷給單個 Session ,進行逐個發(fā)送
        sendTextMessage(session, messageText);
    }


    /**
     * 構(gòu)建完整的消息
     *
     * @param type 消息類型
     * @param message 消息體
     * @param <T> 消息類型
     * @return 消息
     */
    private static <T extends Message> String buildTextMessage(String type, T message) {
        JSONObject messageObject = new JSONObject();
        messageObject.put("type", type);
        messageObject.put("body", message);
        return messageObject.toString();
    }

    /**
     * 真正發(fā)送消息
     *
     * @param session Session
     * @param messageText 消息
     */
    private static void sendTextMessage(Session session, String messageText) {
        if (session == null) {
            log.error("[sendTextMessage][session 為 null]");
            return;
        }
        RemoteEndpoint.Basic basic = session.getBasicRemote();
        if (basic == null) {
            log.error("[sendTextMessage][session 的  為 null]");
            return;
        }
        try {
            basic.sendText(messageText);
        } catch (IOException e) {
            log.error("[sendTextMessage][session({}) 發(fā)送消息{}) 發(fā)生異常",
                    session, messageText, e);
        }
    }

}

在線websocket調(diào)試輸入ws://localhost:8080/即可。

以上就是springboot整合websocket實現(xiàn)群聊思路代碼詳解的詳細內(nèi)容,更多關(guān)于springboot整合websocket的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐

    Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐

    本文主要介紹了Springboot+Redis實現(xiàn)API接口防刷限流的項目實踐,通過限流可以讓系統(tǒng)維持在一個相對穩(wěn)定的狀態(tài),為更多的客戶提供服務,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Java字符拼接成字符串的注意點詳解

    Java字符拼接成字符串的注意點詳解

    這篇文章主要介紹了Java字符拼接成字符串的注意點詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 使用synchronized關(guān)鍵字實現(xiàn)信號量的方法

    使用synchronized關(guān)鍵字實現(xiàn)信號量的方法

    在Java中,信號量(Semaphore)是一種常用的同步工具,它可以用來控制對共享資源的訪問數(shù)量,下面,我們將使用Synchronized關(guān)鍵字來實現(xiàn)一個簡單的信號量,我們的目標是實現(xiàn)一個計數(shù)信號量,其中信號量的計數(shù)指示可以同時訪問某一資源的線程數(shù),需要的朋友可以參考下
    2024-04-04
  • Springdoc替換swagger的實現(xiàn)步驟分解

    Springdoc替換swagger的實現(xiàn)步驟分解

    最近在spring看到的,spring要對api文檔動手了,有些人說swagger不好用,其實也沒那么不好用,有人說代碼還是有點侵入性,這倒是真的,我剛試了springdoc可以說還是有侵入性但是也可以沒有侵入性,這就看你對文檔有什么要求了
    2023-02-02
  • java如何強制刪除java程序占用的文件

    java如何強制刪除java程序占用的文件

    這篇文章主要介紹了java如何強制刪除java程序占用的文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Springboot2 集成 druid 加密數(shù)據(jù)庫密碼的配置方法

    Springboot2 集成 druid 加密數(shù)據(jù)庫密碼的配置方法

    這篇文章給大家介紹Springboot2 集成 druid 加密數(shù)據(jù)庫密碼的配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Java泛型定義與用法入門示例

    Java泛型定義與用法入門示例

    這篇文章主要介紹了Java泛型定義與用法,結(jié)合實例形式分析了java泛型的功能、定義、應用場景及相關(guān)使用注意事項,需要的朋友可以參考下
    2019-08-08
  • SpringBoot文件分片上傳教程

    SpringBoot文件分片上傳教程

    這篇文章主要介紹了SpringBoot文件分片上傳教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring Cloud Zuul路由網(wǎng)關(guān)服務過濾實現(xiàn)代碼

    Spring Cloud Zuul路由網(wǎng)關(guān)服務過濾實現(xiàn)代碼

    這篇文章主要介紹了Spring Cloud Zuul路由網(wǎng)關(guān)服務過濾實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 詳解java中面向?qū)ο笤O(shè)計模式類與類的關(guān)系

    詳解java中面向?qū)ο笤O(shè)計模式類與類的關(guān)系

    這篇文章主要介紹了java面向?qū)ο笤O(shè)計模式中類與類之間的關(guān)系,下面小編和大家一起來學習一下吧
    2019-05-05

最新評論