詳解C#中Socket通訊(四):使用雜湊表管理客戶端
阿新 • • 發佈:2019-02-15
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();
伺服器響應函式: