详解C#中Socket通信(四):使用哈希表管理客户端

来源:互联网 发布:国外体育直播软件 编辑:程序博客网 时间:2024/04/30 03:00

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();


服务器响应函数: