基於Netty的聊天系統(一)通訊原理篇


今天周六,正好順便把聊天系統的通訊原理寫一下,本來是用XMPP+Openfire做了一個聊天,但是在做群聊那塊需要去寫插件來主動向表里變去寫數據,因為openfire外國人寫的,最初設計的群聊是會議室那種形式,和我們現在這種QQ群聊還是有差別的,改造起來比較麻煩,需要去通都源碼等等,openfire是基於mina來寫的,mina和netty又出自同一作者之手,那么我們就基於netty來寫一個吧,首先我們來談一談通訊的原理

1:通訊原理

  首先比方說A和B兩個人要進行聊天(這里我們先討論一對一這種聊天),那么從登錄開始談起,既然有聊天功能所以,肯定要有一個通訊服務器,這個服務器只負責聊天,那么例如查看別人信息了等等這些操作,我們暫且稱之為API服務器,只有聊天是通過scoket訪問通訊服務器的,我們在登錄的時候分為兩個階段,第一個是連接階段,第二個是驗證階段,當登錄成功之后,然后A開始給B發消息,當服務器收到消息之后,找到對應的Handler然后來處理消息,其實在這里我們可以直接解析消息發送給B,這樣是可以的,但是當消息發送多的時候可能會發生消息丟失,所以我們在這里不采取這種方式,我們首先把消息存到數據庫里邊去,數據庫這里我們采用Redis數據庫,基於內存的,然后消息存到數據庫之后,然后我們去看一下B的狀態,如果B在線就去發送一個通知給B,告訴B有消息了,B接收到消息之后,然后發送一個請求到服務器要求獲取消息,服務器接收到之后然后找對應的Handler來進行數據庫查詢,然后把查詢到的消息給B,然后B把收到消息的最大索引號發送會服務器端,然后服務器端根據最大消息的索引號來刪除對應數據庫里邊的消息,一般聊天消息國家都會要求做存儲,方便監察,所以一般還會把全部聊天消息持久化起來,至此,一個簡單的發送-接受消息流程結束了。下邊我花了一個簡單的圖,文字比較多,圖好理解一些

至於Redis數據庫大家可以先熟悉一下,尤其是Redis的數據結構,在這里我們存儲單人聊天信息的時候采用的zset結構。下一篇,我們將會談論一下通訊協議的制定,歡迎大家持續關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM