最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

image-20210528112407993

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

項(xiàng)目展示

image-20210528111445032

通過springboot引入websocket,實(shí)現(xiàn)群聊,通過在線websocket測試進(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配置類

@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)境下,請?jiān)O(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 ,進(jìn)行逐個發(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 ,進(jìn)行逐個發(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實(shí)現(xiàn)群聊思路代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于springboot整合websocket的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java排序算法中的快速排序算法實(shí)現(xiàn)

    Java排序算法中的快速排序算法實(shí)現(xiàn)

    這篇文章主要介紹了Java排序算法中的快速排序算法實(shí)現(xiàn),通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,需要的朋友可以參考下
    2023-12-12
  • SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密的操作代碼

    SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密的操作代碼

    Jasypt(Java?Simplified?Encryption)是一個專注于簡化Java加密操作的開源工具,它提供了一種簡單而強(qiáng)大的方式來處理數(shù)據(jù)的加密和解密,使開發(fā)者能夠輕松地保護(hù)應(yīng)用程序中的敏感信息,本文給大家介紹了SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密,需要的朋友可以參考下
    2024-05-05
  • Java中RabbitMQ的幾種消息確認(rèn)機(jī)制

    Java中RabbitMQ的幾種消息確認(rèn)機(jī)制

    RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文主要介紹了Java中RabbitMQ的幾種消息確認(rèn)機(jī)制,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Spring學(xué)習(xí)教程之AOP模塊的概述

    Spring學(xué)習(xí)教程之AOP模塊的概述

    AOP 從功能的角度來講,可能看作OOP編程方式的一種補(bǔ)充,提供了一種不同的代碼或者系統(tǒng)組織方式,下面這篇文章主要給大家介紹了關(guān)于Spring學(xué)習(xí)教程之AOP模塊的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)

    Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)

    這篇文章主要介紹了Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 深入淺出MyBatis映射器

    深入淺出MyBatis映射器

    映射器是MyBatis最復(fù)雜也最重要的組件,也是基于MyBatis應(yīng)用程序開發(fā)中,本文主要介紹了深入淺出MyBatis映射器,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Java實(shí)現(xiàn)新建有返回值的線程的示例詳解

    Java實(shí)現(xiàn)新建有返回值的線程的示例詳解

    本文主要介紹了一個Java多線程的例題,題目是:使用ThreadLocal管理一號和二號線程,分別存入100元,在三號線程中使用利用一號和二號的計(jì)算結(jié)果來算出賬戶的實(shí)際金額。感興趣的可以了解一下
    2022-09-09
  • Java基礎(chǔ)元注解基本原理示例詳解

    Java基礎(chǔ)元注解基本原理示例詳解

    這篇文章主要為大家介紹了Java基礎(chǔ)元注解基本原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 在springboot?中使用?AIService的方法

    在springboot?中使用?AIService的方法

    這篇文章主要介紹了在springboot?中使用?AIService的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • Spring 中@Validated 分組校驗(yàn)的使用解析

    Spring 中@Validated 分組校驗(yàn)的使用解析

    這篇文章主要介紹了Spring 中@Validated 分組校驗(yàn)的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

齐河县| 高尔夫| 鄂州市| 武穴市| 铜陵市| 石泉县| 瓮安县| 天长市| 漾濞| 永仁县| 高台县| 老河口市| 河池市| 印江| 鄂托克前旗| 靖宇县| 肥乡县| 比如县| 什邡市| 汶上县| 湄潭县| 抚宁县| 洛浦县| 花莲市| 宝鸡市| 乌拉特前旗| 天祝| 勐海县| 徐水县| 渭源县| 卫辉市| 泊头市| 兰溪市| 浏阳市| 城口县| 壤塘县| 明星| 阳原县| 宝清县| 西城区| 甘谷县|