首页 > 学院 > 开发设计 > 正文

基于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.VEVb.com/networkcomms


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表