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

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

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

實(shí)現(xiàn)思路

image-20210528112407993

發(fā)送者向服務(wù)器發(fā)送大家早上好。其它客戶(hù)端可以收到對(duì)應(yīng)消息。

項(xiàng)目展示

image-20210528111445032

通過(guò)springboot引入websocket,實(shí)現(xiàn)群聊,通過(guò)在線websocket測(cè)試進(jìn)行展示。

核心代碼

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配置類(lèi)

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

websocket有4個(gè)注解,解釋如下

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

對(duì)于這個(gè)4個(gè)注解,配置在方法上即可。

WebsocketServerEndpoint接收類(lèi)

@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)境下,請(qǐng)?jiān)O(shè)置成 debug 級(jí)別
   }
   @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工具類(lèi)

@Slf4j
public class WebSocketUtil
{


    // ========== 會(huì)話(huà)相關(guān) ==========

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

    /**
     * 添加 Session 。在這個(gè)方法中,會(huì)添加用戶(hù)和 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ā)送消息給所有在線用戶(hù)
     *
     * @param message 消息體
     * @param <T> 消息類(lèi)型
     */
    public static <T extends Message> void broadcast(String message) {
        // 創(chuàng)建消息
//        String messageText = buildTextMessage(type, message);
        // 遍歷 SESSION_USER_MAP ,進(jìn)行逐個(gè)發(fā)送
        for (String sessionId : SESSION_USER_MAP.keySet()) {
            sendTextMessage(SESSION_USER_MAP.get (sessionId), message);
        }
    }

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


    /**
     * 構(gòu)建完整的消息
     *
     * @param type 消息類(lèi)型
     * @param message 消息體
     * @param <T> 消息類(lèi)型
     * @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實(shí)現(xiàn)群聊思路代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于springboot整合websocket的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

    Java字符拼接成字符串的注意點(diǎn)詳解

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

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

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

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

    最近在spring看到的,spring要對(duì)api文檔動(dòng)手了,有些人說(shuō)swagger不好用,其實(shí)也沒(méi)那么不好用,有人說(shuō)代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說(shuō)還是有侵入性但是也可以沒(méi)有侵入性,這就看你對(duì)文檔有什么要求了
    2023-02-02
  • java如何強(qiáng)制刪除java程序占用的文件

    java如何強(qiáng)制刪除java程序占用的文件

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

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

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

    Java泛型定義與用法入門(mén)示例

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

    SpringBoot文件分片上傳教程

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

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

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

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

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

最新評(píng)論