程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> NetworkComms v3 c#通信框架 處理客戶端離線,

NetworkComms v3 c#通信框架 處理客戶端離線,

編輯:C#入門知識

NetworkComms v3 c#通信框架 處理客戶端離線,


原文: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");
            }
        }

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved