1. 程式人生 > >詳解C#中Socket通訊(四):使用雜湊表管理客戶端

詳解C#中Socket通訊(四):使用雜湊表管理客戶端

public void StartListening()
{           
    //獲取本機IP地址
    IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
    HostIP = ipHost.AddressList[0];            
    try
    {
        IPEndPoint iep = new IPEndPoint(HostIP, 9004);
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        serverSocket.Bind(iep);
        serverSocket.Listen(100);                
        
        //如果有客戶端連線進來,就加入佇列               
        while (flag)
        {                    
            clientSocket = serverSocket.Accept();
            if (clientSocket != null)
            {                        
                string str = clientSocket.RemoteEndPoint.ToString();
                string[] Ipstr = str.Split(':');
                string clientIp = Ipstr[0];
                PVS_Client PvsClient; 
                if (clientList.Contains(clientIp))
                {                            
                    PvsClient = (PVS_Client)clientList[clientIp];
                    PvsClient.killSelf();
                 }
                PvsClient = new PVS_Client(clientSocket);
                //註冊斷開事件
                PvsClient.OnClientdisConnect += new PVS_Client.clientdisConnect(this.removeclient);
                //註冊訊息事件
                PvsClient.OnclientMessage += new PVS_Client.clientMessage(this.getClientMessage);                 clientList.Add(clientIp, client);
            }      
       }
   }
   catch (Exception e)
   {                
       MessageBox.show(e.Message);
   }
}
//斷開處理函式
private void removeclient(object sender, EventArgs e)
{
}
//訊息處理函式
private void getClientMessage(object sender, EventArgs e, string message)
{
 
}

 多客戶端可以使用雜湊表進行管理。Hashtable是System.Collections名稱空間提供的一個容器,用於處理和表現類似key/value的鍵值對,其中key通常可用來快速查詢,value用於儲存對應於key的值。Hashtable中keyvalue鍵值對均為object型別,所以Hashtable可以支援任何型別的keyvalue鍵值對.雜湊表的操作主要有:
  • 在雜湊表中新增元素:HashtableObject.Add(key,value);
  • 在雜湊表中去除元素:HashtableObject.Remove(key);
  • 從雜湊表中移除所有元素:HashtableObject.Clear(); 
  • 判斷雜湊表是否包含特定鍵key:HashtableObject.Contains(key);

    現在,我們改寫伺服器端程式碼,如果同一IP登陸的話,就刪除原來的客戶端,重新建立客戶端,在類定義中新增客戶端列表:

public Hashtable clientList = new Hashtable();


伺服器響應函式: