您的位置:首页 > 理论基础 > 计算机网络

基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(二) 消息转发

2015-03-03 00:00 701 查看
目前 微风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.cnblogs.com/networkcomms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐