亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot+WebSocket怎么實現在線聊天

發布時間:2021-12-07 14:31:38 來源:億速云 閱讀:134 作者:iii 欄目:大數據

本篇內容主要講解“SpringBoot+WebSocket怎么實現在線聊天”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot+WebSocket怎么實現在線聊天”吧!

在線聊天使用了SpringBoot+WebSocket實現,為了保證用戶隱私,所有的聊天數據都保存在系統本地,服務器只進行了數據轉發。OK,那接下來,我們來看下大致的實現步驟。

服務端

服務端首先加入websocket依賴,如下:

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

創建WebSocket的配置類,如下:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/ws/endpointChat").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue","/topic");
    }
}

這里我并未使用原生的websocket協議,而是使用了websocket的子協議stomp,方便一些。消息代理既使用了/queue,又使用了/topic,主要是因為我這里既有點對點的單聊(queue),也有發送系統消息的群聊(topic)。

創建websocket處理類Controller,如下:

@Controller
public class WsController {
    @Autowired
    SimpMessagingTemplate messagingTemplate;

    @MessageMapping("/ws/chat")
    public void handleChat(Principal principal, String msg) {
        String destUser = msg.substring(msg.lastIndexOf(";") + 1, msg.length());
        String message = msg.substring(0, msg.lastIndexOf(";"));
        messagingTemplate.convertAndSendToUser(destUser, "/queue/chat", new ChatResp(message, principal.getName()));
    }
}

消息協議很簡單:發送來的消息,最后一個;后面跟的是該條消息要發送到哪個用戶,這里通過字符串截取將之提取出來。響應消息包含兩個字段,一個是消息內容,一個是該條消息由誰發送。

OK,如此之后,我們的服務端就寫好了,很簡單。

前端

前端代碼稍微復雜,我這里主要和小伙伴介紹下我的大致思路和核心代碼,具體代碼小伙伴可以star源碼進行研究。

首先,當用戶登錄成功之后,我就發起websocket的連接,將ws連接起來,ws的代碼我主要寫在了store中,如下:

connect(context){
    context.state.stomp = Stomp.over(new SockJS("/ws/endpointChat"));
    context.state.stomp.connect({}, frame=> {
    context.state.stomp.subscribe("/user/queue/chat", message=> {
        var msg = JSON.parse(message.body);
        var oldMsg = window.localStorage.getItem(context.state.user.username + "#" + msg.from);
        if (oldMsg == null) {
        oldMsg = [];
        oldMsg.push(msg);
        window.localStorage.setItem(context.state.user.username + "#" + msg.from, JSON.stringify(oldMsg))
        } else {
        var oldMsgJson = JSON.parse(oldMsg);
        oldMsgJson.push(msg);
        window.localStorage.setItem(context.state.user.username + "#" + msg.from, JSON.stringify(oldMsgJson))
        }
        if (msg.from != context.state.currentFriend.username) {
        context.commit("addValue2DotMap", "isDot#" + context.state.user.username + "#" + msg.from);
        }
        //更新msgList
        var oldMsg2 = window.localStorage.getItem(context.state.user.username + "#" + context.state.currentFriend.username);
        if (oldMsg2 == null) {
        context.commit('updateMsgList', []);
        } else {
        context.commit('updateMsgList', JSON.parse(oldMsg2));
        }
    });
    }, failedMsg=> {

    });
}

連接成功之后,就可以準備接收服務端的消息了,接收到服務端的消息后,數據保存在localStorage中,保存格式是 當前用戶名#消息發送方用戶名:[{from:'消息發送方',msg:'消息內容'}],注意后面的是一個json數組,整個存儲的key之所以用當前用戶名#消息發送方用戶名是為了避免同一個瀏覽器多個用戶登錄所產生的數據紊亂,OK,這樣兩個人的聊天記錄都將保存在這個數組中。在聊天展示頁面,當數組中的數據發生變化時,自動更新。

在聊天頁面,通過stomp發送消息,如下:

this.$store.state.stomp.send("/ws/chat", {}, this.msg + ";" + this.currentFriend.username);

注意每條消息的內容除了內容本身外,還要加上當前發送者的名字。
每次發送成功后更新聊天頁面即可。更新聊天頁面代碼如下:

<template v-for="msg in msgList">
<!--發送來的消息-->
<div
    
    v-if="msg.from==currentFriend.username">
    <img :src="currentFriend.userface" class="userfaceImg">
    <div
    >
    {{msg.msg}}
    </div>
</div>
<!--發出去的消息-->
<div v-if="msg.from!=currentFriend.username"
        >
    <div
    >
    {{msg.msg}}
    </div>
    <img :src="currentUser.userface" class="userfaceImg">
</div>
</template>

如果消息中的from字段的值,就是當前聊天的用戶名,則是發送來的消息,否則就是發出去的消息,不同的消息設置不同的樣式即可。

到此,相信大家對“SpringBoot+WebSocket怎么實現在線聊天”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河北省| 施秉县| 富顺县| 兴和县| 梅州市| 华坪县| 隆昌县| 永泰县| 杭锦后旗| 垣曲县| 吴忠市| 乌恰县| 鱼台县| 通山县| 新建县| 平安县| 武川县| 潞西市| 永清县| 阿拉善盟| 弋阳县| 正安县| 富蕴县| 土默特右旗| 佛教| 汉川市| 灵宝市| 浑源县| 广丰县| 崇州市| 万全县| 青神县| 东丰县| 嵊州市| 交城县| 宁波市| 南木林县| 河源市| 晋宁县| 绩溪县| 内黄县|