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