吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Netty實現一個IM即時通訊系統的設計

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

實戰篇一的代碼結構:

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

代碼的層級結構如上所示,接下來,我們將會一個個模塊對邏輯進行講解。

1、登錄

1)實現邏輯

不管是長連接還是短連接,鑒權這個動作都是要有的,我相信這個功能模塊,大家是很好理解的。我這里就不在過多的贅述了,具體實現步驟如下所示:

1、前后端建立 ws 連接

2、前端發送登錄類型的報文,如下所示:

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

token:這里的 token,就是用戶登錄標識,大家可以根據自己所依賴的業務系統,進行修改。

type:這里表示消息報文的類型,本文所有類型定義如下所示:

USER_LOGIN (10, "用戶上線")

USER_LOGIN_RESP (11, "用戶上線響應")

HEARTBEAT_TIMEOUT (30, "心跳超時")

PING (40, "心跳")

PONG (41, "心跳響應")

CHAT (80, "聊天"),

CHAT_RESP (81, "聊天響應")

ACK (90, "確認")

ACK_RESP (91, "確認響應")

UNKNOWN (0, "未知類型")

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

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

消息類型

3、后端對 token 進行校驗,校驗成功就記錄用戶登錄信息

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

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

登錄業務邏輯

2)具體效果

主要的業務代碼我們已經講解完畢了,接下來我們來看看效果:

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

用戶登錄

從上圖,我們可以看到,我們登錄的兩個用戶都成功了,并且返回了對應的用戶信息。

2、維持連接、心跳檢測

這個模塊的功能,其實我們在原理篇二的時候已經講過了具體的實現方案 了,這里也不再過多的贅述了,我們直接來看具體實現方法吧。

1)維持連接

1、前端每10秒發送一次心跳消息,報文如下所示:

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

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

2、后端檢測,用戶是否還在線,如果在線,則刷新用戶的最新在線時間,并回復 PONG 消息。

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

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

維持連接1

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

維持連接2

2)心跳檢測

這里主要是基于 IdleStateEvent 事件實現的。

TextWebSocketFrameHandler 繼承 SimpleChannelInboundHandler 類,并實現 userEventTriggered 方法,具體代碼如下所示:

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

心跳檢測

這里詳細說一下,三種事件的區別:

readerIdleTimeSeconds: 讀超時。即當在指定的時間間隔內沒有從 Channel 讀取到數據時,會觸發一個 READER_IDLE 的 IdleStateEvent 事件。

writerIdleTimeSeconds: 寫超時。即當在指定的時間間隔內沒有數據寫入到 Channel 時,會觸發一個 WRITER_IDLE 的 IdleStateEvent 事件。

allIdleTimeSeconds: 讀/寫超時。即當在指定的時間間隔內沒有讀且沒有寫操作時,會觸發一個 ALL_IDLE 的 IdleStateEvent 事件。

所以,我們這里檢測 ALL_IDLE 事件即可。

3)具體效果

維持連接效果如下所示:

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

維持連接效果

心跳檢測效果如下所示:

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

心跳超時效果1

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

心跳超時效果2

3、聊天消息

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

消息接收:客戶端推送消息到服務端

消息推送:服務端將消息推送到指定的客戶端

這邊主要的難點在于,服務端將消息推送到指定的客戶端,具體場景有2種情況:

消息的發送者和消息的接受者,在同一臺服務器上建立的 ws 連接,這種情況,就很好處理,直接在服務器上找到建立的 ws 連接,然后將消息推送給對應的客戶端。

消息的發送者和消息的接受者,在不同的服務器上建立的 ws 連接,這種情況就比較復雜,實現方案也很多,比較簡單的實現方式就是,發送一條廣播消息,讓對應的服務器,將消息推送到指定的客戶端。

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

1)消息接收

具體步驟如下所示:

1、客戶端發送類型為80的報文,如下所示:

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

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

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

消息接收

2)消息推送

具體步驟如下所示:

1、獲取消息接受者所連接的服務器 ip 地址 2、判斷當前服務器 ip 地址是否和上面的 ip 地址相同,如果相同則推送消息,否則轉發給目標服務器

具體代碼如下所示:

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

消息推送

3)具體效果

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

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

聊天登錄

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

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

張三發送消息給李四

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

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

李四發送消息給張三

4、消息 ack

因為網絡環境異常或者其他異常狀況的發送,可能會出現消息推送失敗的情況,這時候就需要 消息 ack 機制和重試,來保證我們的消息可以推送成功。

1)消息 ack 機制

具體步驟如下:

1、客戶端收到 80 類型的消息,解析并發送 ack 報文,如下所示:

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

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

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

消息ack

2)消息重試

這里因為是單機版 im,所以直接采用 SpringBoot-Job 實現,Job 代碼如下所示:

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

消息重試




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9303

    瀏覽量

    86059
  • 通訊系統
    +關注

    關注

    0

    文章

    70

    瀏覽量

    12247
  • ALL
    ALL
    +關注

    關注

    0

    文章

    6

    瀏覽量

    20903

原文標題:太頂了,使用 Netty 實現了一個 IM 即時通訊系統

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    即時通訊軟件哪家好?企業即時通訊怎么選擇?

    云部署:支持企業私有化部署、雙重數據傳輸加密技術保障企業信息安全imo云辦公室擁有專業的技術團隊,為企業量身定制即時通訊解決方案,降低企業通信成本;提高員工辦公、溝通效率,實現團隊緊密協作;為企業的核心商業信息提供堅實的保障。 了解更多詳情:軟件試用咨詢:021-6628
    發表于 08-09 15:16

    即時通訊是怎么做到的?

    在線狀態、IP地址、 IM客戶端使用的TCP端口(Port)號等,即時通訊好友PC機上的即時通訊軟件收到此信息后將在PC桌面上彈出小窗口
    發表于 01-21 10:41

    Lotus即時通訊工具將與雅虎Google實現互通

    ????1月24日消息,根據達成的交易,IBM公司Lotus Sametime即時通訊服務的用戶將能夠與AOL、雅虎的即時通訊用戶“交談”。
    發表于 03-07 20:47 ?817次閱讀

    即時通訊詳解

    即時通訊詳解1. 引言 2. 即時通訊背景知識
    發表于 08-05 09:55 ?3067次閱讀

    Android平臺簡易即時通訊方案

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

    環信即時通訊

    Android環信即時通訊。。。。。。。。。。。。。。。。
    發表于 05-17 16:41 ?1次下載

    java實現IM即時通訊聊天功能代碼

    從實際工程應用角度出發,以計算機網絡原理為指導,結合當前網絡中的些常用技術,編程實現基于C/S架構的網絡聊天工具是切實可行的。本文為大家介紹java Smack整合Openfire服務器實現
    發表于 01-24 16:10 ?2.8w次閱讀

    區塊鏈即時通訊系統開發,區塊鏈直播聊天平臺開發

    區塊鏈即時通訊系統開發,區塊鏈直播聊天平臺開發數字資產交易所模式和玩法還是那樣,法幣OTC交易所,幣幣撮合交易所,但是最近也是有模式比較新穎,那就是數字資產抵押平臺,這個模式還是比
    發表于 05-30 20:24 ?639次閱讀

    區塊鏈IM即時通訊系統開發技術

    決這現狀我們開發了款區塊鏈IM即時通訊系統IM即時通訊
    發表于 06-07 15:46 ?2983次閱讀

    移動端區塊鏈IM即時通訊直播平臺系統APP開發的技術特征

    通訊其實在我們的生活中是種在不斷完善以及創新的溝通方式,傳統的通訊往往有很多種網絡、電話、寫信等等。經過這些煙花繚亂的傳統通訊方式發展到如今的IM
    的頭像 發表于 06-13 10:41 ?4765次閱讀

    企業內部IM即時通訊系統開發直播聊天APP軟件開發

    IM即時通訊系統興起于1998年,發展至今,IM即時通訊系統(開發咨詢微/電:138.....2
    發表于 07-06 16:39 ?450次閱讀

    IM即時通訊系統開發APP融合區塊鏈應用搭建技術

    IM即時通訊系統APP融合了區塊鏈技術,主打區塊鏈技術把現實與網絡打造成為種高便捷性的社交平臺、資產平臺。當然這款APP不僅對接了直播系統
    發表于 08-23 16:27 ?921次閱讀

    區塊鏈IM社交系統的開發幣圈即時通訊軟件APP

    全球用戶聚集地,通過幣圈的隱秘即時通訊系統,可以暢聊幣圈資訊,分享全球幣圈的最新動態,鍵分享世界各地幣圈用戶玩家,打造幣圈交易、分享、
    發表于 08-30 11:05 ?528次閱讀

    go語言實現的簡單im即時通系統

    ? 本文介紹了 go 語言實現的簡單 im 即時通系統。 簡介 純go
    的頭像 發表于 10-20 16:02 ?3684次閱讀

    拳頭產品|海泰虎訊,新代安全即時通訊系統

    即時通訊系統是目前互聯網上最為流行的通信方式,各種各樣的即時通訊軟件也層出不窮。隨著移動辦公的快速普及,即時通訊軟件在移動辦公中得到越來越廣泛的應用,已經成為日常辦公軟件的
    的頭像 發表于 11-01 08:57 ?659次閱讀
    百家乐官网连线游戏下载| LV百家乐赢钱LV| 百家乐的胜算法| 玩百家乐官网都是什么人| 网上百家乐官网返水| 百家乐官网网站制作| 百家乐官网纯技巧打| 雅加达百家乐官网的玩法技巧和规则 | 百家乐官网棋牌游戏皇冠网| 百家乐官网真人百家乐官网皇冠开户 | 真人百家乐蓝盾娱乐场| 澳门百家乐网上赌博| 威尼斯人娱乐城地址| 娱乐城设计| 诸城市| 百家乐官网单机版游戏下载| 单机百家乐官网小游戏| 做百家乐官网网上投注| 百家乐官网单机游戏下| 百家乐网投开户| 百家乐博乐36bol在线| 网络百家乐网站| 大发888娱乐城都有啥扑克牌游戏| 百家乐规则以及玩法| 大嘴棋牌手机版| 百家乐官网波浪法则| 百家乐官网双龙| 百家乐庄闲点数| 曼哈顿百家乐的玩法技巧和规则 | 全讯网vc8888| 88娱乐城备用网址| 真钱百家乐官网注册送| 火箭百家乐官网的玩法技巧和规则 | 百家乐必胜法技巧| 大发888安装需要多久| 百家乐官网开户送彩网址| 仕達屋百家乐官网的玩法技巧和规则 | 百家乐官网是不是有假| 58百家乐官网的玩法技巧和规则 | 凱旋门百家乐的玩法技巧和规则| 体球网足球比分|