0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Netty實(shí)現(xiàn)一個(gè)IM即時(shí)通訊系統(tǒng)的設(shè)計(jì)

工程師鄧生 ? 來(lái)源:Java知音 ? 作者:啊杰 ? 2022-09-30 15:03 ? 次閱讀

實(shí)戰(zhàn)篇一的代碼結(jié)構(gòu):

c474c46a-3bb3-11ed-9e49-dac502259ad0.png

代碼的層級(jí)結(jié)構(gòu)如上所示,接下來(lái),我們將會(huì)一個(gè)個(gè)模塊對(duì)邏輯進(jìn)行講解。

1、登錄

1)實(shí)現(xiàn)邏輯

不管是長(zhǎng)連接還是短連接,鑒權(quán)這個(gè)動(dòng)作都是要有的,我相信這個(gè)功能模塊,大家是很好理解的。我這里就不在過(guò)多的贅述了,具體實(shí)現(xiàn)步驟如下所示:

1、前后端建立 ws 連接

2、前端發(fā)送登錄類(lèi)型的報(bào)文,如下所示:

{
"token":"2",
"type":"10"
}

token:這里的 token,就是用戶(hù)登錄標(biāo)識(shí),大家可以根據(jù)自己所依賴(lài)的業(yè)務(wù)系統(tǒng),進(jìn)行修改。

type:這里表示消息報(bào)文的類(lèi)型,本文所有類(lèi)型定義如下所示:

USER_LOGIN (10, "用戶(hù)上線")

USER_LOGIN_RESP (11, "用戶(hù)上線響應(yīng)")

HEARTBEAT_TIMEOUT (30, "心跳超時(shí)")

PING (40, "心跳")

PONG (41, "心跳響應(yīng)")

CHAT (80, "聊天"),

CHAT_RESP (81, "聊天響應(yīng)")

ACK (90, "確認(rèn)")

ACK_RESP (91, "確認(rèn)響應(yīng)")

UNKNOWN (0, "未知類(lèi)型")

示例代碼如下圖所示,WsMsgDispatcher.dispatch

c4894ee4-3bb3-11ed-9e49-dac502259ad0.jpg

消息類(lèi)型

3、后端對(duì) token 進(jìn)行校驗(yàn),校驗(yàn)成功就記錄用戶(hù)登錄信息。

示例代碼如下圖所示,UserLoginProcessor.login

c4a7f1aa-3bb3-11ed-9e49-dac502259ad0.jpg

登錄業(yè)務(wù)邏輯

2)具體效果

主要的業(yè)務(wù)代碼我們已經(jīng)講解完畢了,接下來(lái)我們來(lái)看看效果:

c4d601a8-3bb3-11ed-9e49-dac502259ad0.jpg

用戶(hù)登錄

從上圖,我們可以看到,我們登錄的兩個(gè)用戶(hù)都成功了,并且返回了對(duì)應(yīng)的用戶(hù)信息。

2、維持連接、心跳檢測(cè)

這個(gè)模塊的功能,其實(shí)我們在原理篇二的時(shí)候已經(jīng)講過(guò)了具體的實(shí)現(xiàn)方案 了,這里也不再過(guò)多的贅述了,我們直接來(lái)看具體實(shí)現(xiàn)方法吧。

1)維持連接

1、前端每10秒發(fā)送一次心跳消息,報(bào)文如下所示:

{
"type":"40",
"fromId":"2"
}

注:前端發(fā)送的每個(gè)消息,理論上都是需要帶上用戶(hù)表示的,后端都是需要進(jìn)行鑒權(quán)操作的。我們這里為了方便講解(偷懶,bushi)將這部分邏輯進(jìn)行了簡(jiǎn)化,大家在具體實(shí)現(xiàn)的時(shí)候,記得一定要加上 鑒權(quán)邏輯

2、后端檢測(cè),用戶(hù)是否還在線,如果在線,則刷新用戶(hù)的最新在線時(shí)間,并回復(fù) PONG 消息。

示例代碼如下圖所示,HeartBeatProcessor.process

c4f291a6-3bb3-11ed-9e49-dac502259ad0.jpg

維持連接1

c5099784-3bb3-11ed-9e49-dac502259ad0.jpg

維持連接2

2)心跳檢測(cè)

這里主要是基于 IdleStateEvent 事件實(shí)現(xiàn)的。

TextWebSocketFrameHandler 繼承 SimpleChannelInboundHandler 類(lèi),并實(shí)現(xiàn) userEventTriggered 方法,具體代碼如下所示:

c5298e7c-3bb3-11ed-9e49-dac502259ad0.jpg

心跳檢測(cè)

這里詳細(xì)說(shuō)一下,三種事件的區(qū)別:

readerIdleTimeSeconds: 讀超時(shí)。即當(dāng)在指定的時(shí)間間隔內(nèi)沒(méi)有從 Channel 讀取到數(shù)據(jù)時(shí),會(huì)觸發(fā)一個(gè) READER_IDLE 的 IdleStateEvent 事件。

writerIdleTimeSeconds: 寫(xiě)超時(shí)。即當(dāng)在指定的時(shí)間間隔內(nèi)沒(méi)有數(shù)據(jù)寫(xiě)入到 Channel 時(shí),會(huì)觸發(fā)一個(gè) WRITER_IDLE 的 IdleStateEvent 事件。

allIdleTimeSeconds: 讀/寫(xiě)超時(shí)。即當(dāng)在指定的時(shí)間間隔內(nèi)沒(méi)有讀且沒(méi)有寫(xiě)操作時(shí),會(huì)觸發(fā)一個(gè) ALL_IDLE 的 IdleStateEvent 事件。

所以,我們這里檢測(cè) ALL_IDLE 事件即可。

3)具體效果

維持連接效果如下所示:

c55d429e-3bb3-11ed-9e49-dac502259ad0.jpg

維持連接效果

心跳檢測(cè)效果如下所示:

c57ee6d8-3bb3-11ed-9e49-dac502259ad0.jpg

心跳超時(shí)效果1

c58e6284-3bb3-11ed-9e49-dac502259ad0.jpg

心跳超時(shí)效果2

3、聊天消息

聊天消息模塊主要分為兩部分:

消息接收:客戶(hù)端推送消息到服務(wù)端

消息推送:服務(wù)端將消息推送到指定的客戶(hù)端

這邊主要的難點(diǎn)在于,服務(wù)端將消息推送到指定的客戶(hù)端,具體場(chǎng)景有2種情況:

消息的發(fā)送者和消息的接受者,在同一臺(tái)服務(wù)器上建立的 ws 連接,這種情況,就很好處理,直接在服務(wù)器上找到建立的 ws 連接,然后將消息推送給對(duì)應(yīng)的客戶(hù)端。

消息的發(fā)送者和消息的接受者,在不同的服務(wù)器上建立的 ws 連接,這種情況就比較復(fù)雜,實(shí)現(xiàn)方案也很多,比較簡(jiǎn)單的實(shí)現(xiàn)方式就是,發(fā)送一條廣播消息,讓對(duì)應(yīng)的服務(wù)器,將消息推送到指定的客戶(hù)端。

本文由于是 單機(jī)版 的 im,所以只會(huì)有第一種情況發(fā)生,第二種情況就留給大家自由發(fā)揮了。

1)消息接收

具體步驟如下所示:

1、客戶(hù)端發(fā)送類(lèi)型為80的報(bào)文,如下所示:

{
"type":"80",
"fromId":"1",
"toId":"2",
"content":{
"contentType":1,
"body":"測(cè)試消息"
}
}

2、服務(wù)端(ChatProcessor)對(duì)消息進(jìn)行處理,具體代碼如下所示:

c59db5d6-3bb3-11ed-9e49-dac502259ad0.png

消息接收

2)消息推送

具體步驟如下所示:

1、獲取消息接受者所連接的服務(wù)器 ip 地址 2、判斷當(dāng)前服務(wù)器 ip 地址是否和上面的 ip 地址相同,如果相同則推送消息,否則轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器

具體代碼如下所示:

c5ce93f4-3bb3-11ed-9e49-dac502259ad0.png

消息推送

3)具體效果

1、我們先登錄兩個(gè)用戶(hù),分別是張三、李四,如下圖所示:

c60cd286-3bb3-11ed-9e49-dac502259ad0.png

聊天登錄

2、張三發(fā)送消息給李四,如下圖所示:

c629c292-3bb3-11ed-9e49-dac502259ad0.png

張三發(fā)送消息給李四

3、李四發(fā)送消息給張三,如下圖所示:

c6547a3c-3bb3-11ed-9e49-dac502259ad0.png

李四發(fā)送消息給張三

4、消息 ack

因?yàn)?a target="_blank">網(wǎng)絡(luò)環(huán)境異常或者其他異常狀況的發(fā)送,可能會(huì)出現(xiàn)消息推送失敗的情況,這時(shí)候就需要 消息 ack 機(jī)制和重試,來(lái)保證我們的消息可以推送成功。

1)消息 ack 機(jī)制

具體步驟如下:

1、客戶(hù)端收到 80 類(lèi)型的消息,解析并發(fā)送 ack 報(bào)文,如下所示:

{
"type":"90",
"msgId":"2bfea133-72a8-4315-82aa-80049fe4fb7b"
}

2、服務(wù)端收到 ack 消息,變更消息狀態(tài)(AckProcessor),具體代碼如下圖所示:

c67a0efa-3bb3-11ed-9e49-dac502259ad0.png

消息ack

2)消息重試

這里因?yàn)槭菃螜C(jī)版 im,所以直接采用 SpringBoot-Job 實(shí)現(xiàn),Job 代碼如下所示:

c6ab8c00-3bb3-11ed-9e49-dac502259ad0.png

消息重試




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8843

    瀏覽量

    84946
  • 通訊系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    68

    瀏覽量

    12186
  • ALL
    ALL
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    20851

原文標(biāo)題:太頂了,使用 Netty 實(shí)現(xiàn)了一個(gè) IM 即時(shí)通訊系統(tǒng)

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    即時(shí)通訊軟件哪家好?企業(yè)即時(shí)通訊怎么選擇?

    云部署:支持企業(yè)私有化部署、雙重?cái)?shù)據(jù)傳輸加密技術(shù)保障企業(yè)信息安全imo云辦公室擁有專(zhuān)業(yè)的技術(shù)團(tuán)隊(duì),為企業(yè)量身定制即時(shí)通訊解決方案,降低企業(yè)通信成本;提高員工辦公、溝通效率,實(shí)現(xiàn)團(tuán)隊(duì)緊密協(xié)作;為企業(yè)的核心商業(yè)信息提供堅(jiān)實(shí)的保障。 了解更多詳情:軟件試用咨詢(xún):021-6628
    發(fā)表于 08-09 15:16

    即時(shí)通訊是怎么做到的?

    在線狀態(tài)、IP地址、 IM客戶(hù)端使用的TCP端口(Port)號(hào)等,即時(shí)通訊好友PC機(jī)上的即時(shí)通訊軟件收到此信息后將在PC桌面上彈出個(gè)小窗口
    發(fā)表于 01-21 10:41

    Lotus即時(shí)通訊工具將與雅虎Google實(shí)現(xiàn)互通

    ????1月24日消息,根據(jù)達(dá)成的交易,IBM公司Lotus Sametime即時(shí)通訊服務(wù)的用戶(hù)將能夠與AOL、雅虎的即時(shí)通訊用戶(hù)“交談”。
    發(fā)表于 03-07 20:47 ?786次閱讀

    即時(shí)通訊詳解

    即時(shí)通訊詳解1. 引言 2. 即時(shí)通訊背景知識(shí)
    發(fā)表于 08-05 09:55 ?3027次閱讀

    Android平臺(tái)簡(jiǎn)易即時(shí)通訊方案

    論文簡(jiǎn)單介紹Android平臺(tái)的特性,主要闡述了基于Android平臺(tái)簡(jiǎn)易即時(shí)通訊(IM)的作用和功能以及實(shí)現(xiàn)方法。
    發(fā)表于 02-21 10:27 ?5122次閱讀
    Android平臺(tái)簡(jiǎn)易<b class='flag-5'>即時(shí)通訊</b>方案

    環(huán)信即時(shí)通訊

    Android環(huán)信即時(shí)通訊。。。。。。。。。。。。。。。。
    發(fā)表于 05-17 16:41 ?1次下載

    java實(shí)現(xiàn)IM即時(shí)通訊聊天功能代碼

    從實(shí)際工程應(yīng)用角度出發(fā),以計(jì)算機(jī)網(wǎng)絡(luò)原理為指導(dǎo),結(jié)合當(dāng)前網(wǎng)絡(luò)中的些常用技術(shù),編程實(shí)現(xiàn)基于C/S架構(gòu)的網(wǎng)絡(luò)聊天工具是切實(shí)可行的。本文為大家介紹java Smack整合Openfire服務(wù)器實(shí)現(xiàn)
    發(fā)表于 01-24 16:10 ?2.7w次閱讀

    區(qū)塊鏈即時(shí)通訊系統(tǒng)開(kāi)發(fā),區(qū)塊鏈直播聊天平臺(tái)開(kāi)發(fā)

    區(qū)塊鏈即時(shí)通訊系統(tǒng)開(kāi)發(fā),區(qū)塊鏈直播聊天平臺(tái)開(kāi)發(fā)數(shù)字資產(chǎn)交易所模式和玩法還是那樣,法幣OTC交易所,幣幣撮合交易所,但是最近也是有個(gè)模式比較新穎,那就是數(shù)字資產(chǎn)抵押平臺(tái),這個(gè)模式還是比
    發(fā)表于 05-30 20:24 ?566次閱讀

    區(qū)塊鏈IM即時(shí)通訊系統(tǒng)開(kāi)發(fā)技術(shù)

    決這現(xiàn)狀我們開(kāi)發(fā)了款區(qū)塊鏈IM即時(shí)通訊系統(tǒng),IM即時(shí)通訊
    發(fā)表于 06-07 15:46 ?2919次閱讀

    移動(dòng)端區(qū)塊鏈IM即時(shí)通訊直播平臺(tái)系統(tǒng)APP開(kāi)發(fā)的技術(shù)特征

    通訊其實(shí)在我們的生活中是種在不斷完善以及創(chuàng)新的溝通方式,傳統(tǒng)的通訊往往有很多種網(wǎng)絡(luò)、電話(huà)、寫(xiě)信等等。經(jīng)過(guò)這些煙花繚亂的傳統(tǒng)通訊方式發(fā)展到如今的IM
    的頭像 發(fā)表于 06-13 10:41 ?4660次閱讀

    企業(yè)內(nèi)部IM即時(shí)通訊系統(tǒng)開(kāi)發(fā)直播聊天APP軟件開(kāi)發(fā)

    IM即時(shí)通訊系統(tǒng)興起于1998年,發(fā)展至今,IM即時(shí)通訊系統(tǒng)(開(kāi)發(fā)咨詢(xún)微/電:138.....2
    發(fā)表于 07-06 16:39 ?417次閱讀

    IM即時(shí)通訊系統(tǒng)開(kāi)發(fā)APP融合區(qū)塊鏈應(yīng)用搭建技術(shù)

    IM即時(shí)通訊系統(tǒng)APP融合了區(qū)塊鏈技術(shù),主打區(qū)塊鏈技術(shù)把現(xiàn)實(shí)與網(wǎng)絡(luò)打造成為種高便捷性的社交平臺(tái)、資產(chǎn)平臺(tái)。當(dāng)然這款A(yù)PP不僅對(duì)接了直播系統(tǒng)
    發(fā)表于 08-23 16:27 ?881次閱讀

    區(qū)塊鏈IM社交系統(tǒng)的開(kāi)發(fā)幣圈即時(shí)通訊軟件APP

    個(gè)全球用戶(hù)聚集地,通過(guò)幣圈的隱秘即時(shí)通訊系統(tǒng),可以暢聊幣圈資訊,分享全球幣圈的最新動(dòng)態(tài),鍵分享世界各地幣圈用戶(hù)玩家,打造幣圈交易、分享、
    發(fā)表于 08-30 11:05 ?492次閱讀

    go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單im即時(shí)通系統(tǒng)

    ? 本文介紹了個(gè) go 語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單 im 即時(shí)通系統(tǒng)。 簡(jiǎn)介 純go
    的頭像 發(fā)表于 10-20 16:02 ?3571次閱讀

    拳頭產(chǎn)品|海泰虎訊,新代安全即時(shí)通訊系統(tǒng)

    即時(shí)通訊系統(tǒng)是目前互聯(lián)網(wǎng)上最為流行的通信方式,各種各樣的即時(shí)通訊軟件也層出不窮。隨著移動(dòng)辦公的快速普及,即時(shí)通訊軟件在移動(dòng)辦公中得到越來(lái)越廣泛的應(yīng)用,已經(jīng)成為日常辦公軟件的
    的頭像 發(fā)表于 11-01 08:57 ?574次閱讀