基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(二) 消息转发
2015-03-03 00:00
701 查看
目前 微风IM发送消息采用由服务器转发的形式。
当用户聊天的时候,先把消息发送到服务器,服务器再转发给目标用户:
客户端发送消息:
ChatContract契约类
服务器端:
注册消息处理方法
处理方法
www.networkcomms.cn
www.cnblogs.com/networkcomms
当用户聊天的时候,先把消息发送到服务器,服务器再转发给目标用户:
客户端发送消息:
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
相关文章推荐
- 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(二) 消息转发
- 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(三) 客户端下线
- 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(一) 用户管理
- 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(一) 用户管理
- 【开源下载】c#编写的聊天程序微风IM 版本2 增加局域网P2P通信
- 【转】【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)
- 【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)
- 【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)
- c#编写的基于TCP通信的微风IM 版本3 新年新UI
- c#编写的基于TCP通信的微风IM 版本3 新年新UI
- c#编写的基于TCP通信的微风IM 版本3 新年新UI
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 【开源下载】基于TCP网络通信的自动升级程序c#源码
- c#编写的基于TCP通信的微风IM 版本3 新年新UI
- 【开源下载】基于TCP网络通信的自动升级程序c#源码
- 基于TCP网络通信的自动升级程序源码分析-启动升级文件下载程序
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 基于TCP网络通信的自动升级程序源码分析-启动升级文件下载程序
- 基于TCP网络通信的自动升级程序源码分析-启动升级文件下载程序
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息