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
新闻热点
疑难解答