日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

IM设计与实现的系统模块的聊天记录

發布時間:2023/12/13 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 IM设计与实现的系统模块的聊天记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  到非常多開發IM系統的朋友都想實現聊天記錄存儲和查詢這一不可或缺的功能,這里我就把自己前段時間為傲瑞通(OrayTalk)開發聊天記錄模塊的經驗分享出來,供須要的朋友參考下。

一.整體設計

1.存儲位置  

從一開始我們就打算在服務端和client本地同一時候存儲聊天記錄。并且,在client查看聊天記錄時。能夠選擇是從本地載入、還是從server載入。這樣做的優點有兩個:

(1)從本地載入聊天記錄速度很快。

(2)當更換了登錄的機器,在不論什么地方不論什么時刻都能夠從server載入完整的聊天記錄,記錄永遠不會丟失。

2.存儲方案

(1)在服務端存儲聊天記錄當然使用我們主流的數據庫SqlServer或Mysql等。

(2)在client,我們開始選擇的是使用序列化技術。可是。考慮到當聊天記錄數據量龐大時,序列化方案就不夠靈活了。并且性能也跟不上。所以,最后決定使用輕量級的數據庫Sqlite。

3.ORM框架

  DataRabbit的最新版本號添加了對Sqlite的支持,而且對不同數據庫的操作API是全然一致的。所以我們使用DataRabbit寫了一個小組件來完畢聊天記錄的存儲與查詢等數據庫訪問操作。

而不管是client還是服務端的聊天記錄存儲相關的工作,都交給這個組件來完畢。

二.詳細實現

1.ChatMessageRecord類

  一條聊天記錄基本上包括了下面幾個內容:發送人、接收人、內容、時間等。

而且,我們想將兩人聊天及群聊天抽象成同一個模型,于是,聊天記錄的Entity類ChatMessageRecord設計成例如以下模樣:

    public class ChatMessageRecord
    {     
        #region AutoID
        private long autoID = 0;
        /// <summary>
        /// 自增ID,編號。
        /// </summary>
        public long AutoID
        {
            get { return autoID; }
            set { autoID = value; }
        }
        #endregion

        #region SpeakerID
        private string speakerID = "";
        /// <summary>
        /// 發言人的ID。
        /// </summary>
        public string SpeakerID
        {
            get { return speakerID; }
            set { speakerID = value; }
        }
        #endregion

        #region AudienceID
        private string audienceID = "";
        /// <summary>
        /// 聽眾ID。能夠為GroupID。

/// </summary> public string AudienceID { get { return audienceID; } set { audienceID = value; } } #endregion #region OccureTime private DateTime occureTime = DateTime.Now; /// <summary> /// 聊天記錄發生的時間。

/// </summary> public DateTime OccureTime { get { return occureTime; } set { occureTime = value; } } #endregion #region ContentRtf private string contentRtf = ""; /// <summary> /// 聊天的內容。 /// </summary> public string ContentRtf { get { return contentRtf; } set { contentRtf = value; } } #endregion #region IsGroupChat private bool isGroupChat = false; /// <summary> /// 是否為群聊記錄。 /// </summary> public bool IsGroupChat { get { return isGroupChat; } set { isGroupChat = value; } } #endregion }

  在ChatMessageRecord的定義中。聊天內容字段被設計為string類型,這是由于在OrayTalk中,聊天內容是富文本RTF格式的。

假設須要,能夠更改為byte[]類型,這樣通過自己定義的序列化操作就能夠承載更復雜的聊天格式。

  最后一個字段IsGroupChat表明當前記錄是否為群聊記錄,假設是群聊記錄,那么,AudienceID就不是好友的ID了,而是目標群組的ID。

  最后請注意:ChatMessageRecord實體與數據庫中的ChatMessageRecord表是全然映射的關系,這才使得DataRabbit的ORM數據訪問成為可能。

2.ChatRecordPage類

  當我們請求聊天記錄時,因為記錄數量可能很龐大,所以。採用分頁是不可避免的。我們用ChatRecordPage來封裝查詢返回的一頁聊天記錄:

依據ChatRecordPage中的TotalCount字段,查詢者能夠知道符合條件的記錄數是多少,如此,就能夠知道總共同擁有多少頁。

3.IChatRecordPersister接口

  不管是client還是服務端存儲與查詢聊天記錄。我們都使用同一個接口IChatRecordPersister來進行抽象:

    public interface IChatRecordPersister
    {
        /// <summary>
        /// 插入一條聊天記錄(包含群聊天記錄)。

/// </summary> void InsertChatMessageRecord(ChatMessageRecord record); /// <summary> /// 獲取一頁與好友的聊天記錄。

/// </summary> /// <param name="timeScope">日期范圍</param> /// <param name="myID">自己的UserID</param> /// <param name="friendID">好友的ID</param> /// <param name="pageSize">頁大小</param> /// <param name="pageIndex">頁索引</param> /// <returns>聊天記錄頁</returns> ChatRecordPage GetChatRecordPage(DateTimeScope timeScope, string myID, string friendID, int pageSize, int pageIndex); /// <summary> /// 獲取一頁群聊天記錄。

/// </summary> /// <param name="timeScope">日期范圍</param> /// <param name="groupID">群ID</param> /// <param name="pageSize">頁大小</param> /// <param name="pageIndex">頁索引</param> /// <returns>聊天記錄頁</returns> ChatRecordPage GetGroupChatRecordPage(DateTimeScope timeScope, string groupID, int pageSize, int pageIndex); }

(1)插入游戲記錄時,與好友聊天記錄以及群聊天記錄使用同一個InsertChatMessageRecord方法就可以,僅僅是在構造ChatMessageRecord對象時,字段的賦值有所差別。

(2)使用DataRabbit實現該接口時(如ChatRecordPersister類),通過屬性DataBaseType來控制訪問的是否為Sqlite數據庫。然后在服務端使用ChatRecordPersister存取聊天記錄時,就將DataBaseType設置為SqlServer;client則設置為Sqlite。

三.可能的Remoting的接口

  當我們從server載入聊天記錄時,能夠考慮使用Remoting技術來實現,假設是這樣,僅僅須要在服務端把IChatRecordPersister接口暴露為Remoting服務。然后client使用這一Remoting服務進行聊天記錄查詢。這樣一來,client在切換從本地載入和從server載入時。僅僅須要切換IChatRecordPersister為本地ChatRecordPersister對象的引用或remoting遠程引用就可以。

整個的代碼實現將會很簡潔一致。

  到這里,關于聊天記錄模塊的設計與實現就介紹得差點兒相同了,按照這種思路,大家在自己的IM系統中添加聊天記錄的功能應該是非常easy的了。

最后。上一張OrayTalkclient查詢聊天記錄界面的截圖:

 就到這里了。還有疑問的朋友。請給我留言,我會及時回復的。

版權聲明:本文博主原創文章,博客,未經同意不得轉載。

總結

以上是生活随笔為你收集整理的IM设计与实现的系统模块的聊天记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。