基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(三) 客户端下线_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(三) 客户端下线

基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(三) 客户端下线

 2015/2/14 21:16:45  networkcomms.cn  程序员俱乐部  我要评论(0)
  • 摘要:在微风IM中,当某个客户端下线后,其他客户端能够感知到此用户已经下线,并把其头像图标变成灰色。感知连接的掉线,是networkcomms框架内置的功能,服务器通过心跳检测得知某连接掉线,会从networkcomms内部维护的连接列表中删除此连接,并触发相应的委托。我们要处理某连接掉线,只需要注册NetworkComms.AppendGlobalConnectionCloseHandler方法即可服务器端代码如下://如果某客户端离线,触发此方法NetworkComms
  • 标签:程序 C# 聊天程序 客户 分析 客户端 开源 技术

在微风IM中,当某个客户端下线后,其他客户端能够感知到此用户已经下线,并把其头像图标变成灰色。

感知连接的掉线,是networkcomms框架内置的功能,服务器通过心跳检测得知某连接掉线,会从networkcomms内部维护的连接列表中删除此连接,并触发相应的委托。

我们要处理某连接掉线,只需要注册  NetworkComms.AppendGlobalConnectionCloseHandler 方法即可

服务器端代码如下: 

  //如果某客户端离线,触发此方法
            NetworkComms.AppendGlobalConnectionCloseHandler(HandleConnectionClosed);

客户端某用户离线的处理方法

  //处理某可客户端离线情况
        private void HandleConnectionClosed(Connection connection)
        {
            try
            {
               
                var tempUserID = "";
                
                lock (syncLocker)
                {
                    //在用户字典中找到网络连接相对应的用户ID
                    foreach (var kv in userManager)
                    {
                        //如果要关闭的网络连接,与某个用户的网络连接相同,则找出此用户
                        if (kv.Value == connection.ConnectionInfo.NetworkIdentifier)
                        {
                            tempUserID = kv.Key;
                            break;
                        }
                    }

                    if (tempUserID != "")
                    {
                        //如果找到的用户ID不为空,则从用户字典中删除此项
                        if (userManager.ContainsKey(tempUserID))
                        {
                            //连接关闭时,从用户管理器中删除该用户
                            userManager.Remove(tempUserID);
                        }
                    }
                }


                //发送通知给其他客户端,告知其某个用户下线 
                if (tempUserID != "")
                {
                    
                    UserStateNotify(tempUserID, false);
                }
                //应该发送一个消息给所有在线的其他用户
            }
            catch (Exception ex)
            {
                LogTools.LogException(ex, "NetworkComms_ConnectionClosed");
            }
        }

 www.networkcomms.cn

www.cnblogs.com/networkcomms

 

发表评论
用户名: 匿名