国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

基于Tcp通信的聊天程序微風IM(c#開源) -技術分析(二) 消息轉發

2019-11-17 02:33:45
字體:
來源:轉載
供稿:網友

基于Tcp通信的聊天程序微風IM(c#開源) -技術分析(二) 消息轉發

NetworkComms網絡通信框架序言

目前 微風IM發送消息采用由服務器轉發的形式。

當用戶聊天的時候,先把消息發送到服務器,服務器再轉發給目標用戶:

客戶端發送消息:

 ChatContract chatContract = new ChatContract();            chatContract.UserID = Common.UserID;            chatContract.UserName = Common.UserName;            chatContract.DestUserID = this.friendID;            chatContract.DestUserName = this.friendID;            chatContract.Content = content;            chatContract.SendTime = DateTime.Now;            Common.TcpConn.SendObject<ChatContract>("ChatMessage", chatContract); 
 /// <summary>    /// 此契約類存放聊天對話消息    /// </summary>    [PRotoContract]    public class ChatContract    {         //用戶ID        [ProtoMember(1)]        public string UserID { get; set; }        //用戶名        [ProtoMember(2)]        public string UserName { get; set; }        //目標用戶ID        [ProtoMember(3)]        public string DestUserID { get; set; }        //目標用戶名        [ProtoMember(4)]        public string DestUserName { get; set; }        //聊天的內容,主要是文本消息        [ProtoMember(5)]        public string Content { get; set; }        //發送的時間        [ProtoMember(6)]        public DateTime SendTime { get; set; }               public  ChatContract()        { }        public ChatContract(string userID, string userName, string destUserID, string destUserName, string  content,DateTime sendTime)        {            this.UserID = userID;            this.UserName = userName;            this.DestUserID = destUserID;            this.DestUserName = destUserName;            this.Content = content;            this.SendTime = sendTime;        }         }
ChatContract契約類

服務器端:

注冊消息處理方法

 //客戶端發來的聊天信息  轉發之             NetworkComms.AppendGlobalIncomingPacketHandler<ChatContract>("ChatMessage", IncomingChatMessage);

處理方法

 private void IncomingChatMessage(PacketHeader header, Connection connection, ChatContract chatContract)        {            try            {                lock (syncLocker)                {                    //如果用戶在線,轉發消息  根據用戶管理器中是否存在目標用戶 判斷目標用戶是否在線                    if (userManager.ContainsKey(chatContract.DestUserID))                    {                        //userManager[chatContract.DestUserID].SendObject("ServerChatMessage", chatContract);                        //應該只有一個返回的連接,但是由于返回的是列表,遍歷一下也可                        foreach (Connection conn in NetworkComms.GetExistingConnection(userManager[chatContract.DestUserID], ConnectionType.TCP))                        {                            conn.SendObject("ServerChatMessage", chatContract);                        }                    }                    //如果用戶不在線,把數據加入到數據庫中                    else                    {                        OffLineMessage msg = new OffLineMessage();                        msg.UserID = chatContract.UserID;                        msg.UserName = chatContract.UserName;                        msg.DestUserID = chatContract.DestUserID;                        msg.DestUerName = chatContract.DestUserName;                        msg.ChatContent = chatContract.Content;                        msg.SendTime = chatContract.SendTime;                        DoOffLineMessage.Save(msg);                    }                }            }            catch (Exception ex)            {                LogTools.LogException(ex, "IncomingChatMessage");            }        }

www.networkcomms.cn

www.survivalescaperooms.com/networkcomms


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临洮县| 象山县| 新竹市| 阿鲁科尔沁旗| 罗定市| 广丰县| 宁津县| 洛隆县| 沂源县| 若尔盖县| 孟州市| 交城县| 安化县| 南木林县| 望江县| 封丘县| 海林市| 柏乡县| 金昌市| 长垣县| 彭州市| 大庆市| 淮南市| 阿勒泰市| 大冶市| 石河子市| 武乡县| 邹城市| 香格里拉县| 恩施市| 阳山县| 茶陵县| 安徽省| 海门市| 雷山县| 会昌县| 陆河县| 银川市| 海晏县| 永靖县| 镇安县|