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
新聞熱點
疑難解答