原文:http://www.networkcomms.cn/Article/ViewArticle.aspx?ItemID=27833&PageID=1224
《1》处理客户端离线
在使用networkComms v3进行网络通信时,客户端离线通常我们不需要做额外的处理。
在服务器端 NetworkComms静态类用于掌控全局
所有与服务器的连接,都保存在
allConnectionsByIdentifier
allConnectionsByEndPoint
这2个字典中
当有新客户单加入后,连接创建完成后,通信框架会自动把连接加入到上面2个字典中
当有客户端离线后,服务器端通过心跳检测,会探测到某客户端已经离线,之后通信框架调用 NetworkComms.RemoveConnectionReference 静态方法,把离线客户端相关的连接从上面的字典中删除即可。
客户端离线的情况,通讯框架已经帮我们处理好了,不用我们额外做工作。
《2》处理IM系统中的客户端离线
在IM系统中,我们通常在服务器端加入用户管理器,当某用户上线时,要通知其他用户。当某客户端掉线时,也要通知其他用户。
这种情况下,我们就需要在服务器做另外的工作,用于通知其他用户某客户端用户已经离线。
方法很简单:
//注册客户端离线事件
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"); } }
《3》处理文件传输系统中的客户端离线
如果客户端正在与服务器传输文件的时候网路断开,我们需要告知服务器删除与此用户相关的缓存文件(传输了一半的文件)。
1、注册一个客户端离线的出来方法
NetworkComms.AppendGlobalConnectionCloseHandler(HandleConnectionClosed);
2、具体的处理方法
private void HandleConnectionClosed(Connection connection) { try { //通知文件发送器,客户端已经下线 this.fileManager.RemoveFileByNetworkID(connection.ConnectionInfo.NetworkIdentifier.ToString()); //通知文件接收器,客户端已经下线 this.recvManager.RemoveFileByNetworkID(connection.ConnectionInfo.NetworkIdentifier.ToString()); //遍历查看用户ID是否存在 var tempUserID = ""; //删除收文字典的相关信息 lock (syncLocker) { //Remove any associated data from the caches incomingDataCache.Remove(connection.ConnectionInfo); incomingDataInfoCache.Remove(connection.ConnectionInfo); foreach (var kv in userManager) { //如果要关闭的网络连接,与某个用户的网络连接相同,则找出此用户 if (kv.Value == connection.ConnectionInfo.NetworkIdentifier) { tempUserID = kv.Key; break; } } if (tempUserID != "") { if (userManager.ContainsKey(tempUserID)) { //连接关闭时,从用户管理器中删除该用户 userManager.Remove(tempUserID); } } } } catch (Exception ex) { LogTools.LogException(ex, "NetworkComms_ConnectionClosed"); } }