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