2009-10-09 7 views
0

Je suis en train de développer des choses supplémentaires sur le serveur de jeu, mais je ne comprends pas le code que j'ai reçu (mais cela fonctionne). Je serais vraiment heureux si quelqu'un pouvait m'expliquer, pourquoi (dans la méthode recievedata) il y a la suppression de la liste des sockets et ensuite le remplissage. Je ne peux pas voir le point.Question de sockets serveur (exemple de commentaire de code)

this.mReceiveDataThread = new System.Threading.Thread(this.ReceiveData); 

      protected void ReceiveData() 
     { 
      List<System.Net.Sockets.Socket> sockets = new List<System.Net.Sockets.Socket>(); 
      bool noClients = false; 
      while (true) 
      { 
       if (noClients) 
       { 
        System.Threading.Thread.Sleep(RECEIVE_DATA_NO_CLIENT_WAIT_TIME); 
        noClients = false; 
       } 
       this.mClientsSynchronization.AcquireReaderLock(-1); 
       try 
       { 
        if (this.mClients == null || this.mClients.Count == 0) 
        { 
         noClients = true; 
         continue; 
        } 
        sockets.Clear(); 
        for (int i = 0; i < this.mClientsValues.Count; i++) 
        { 
         Client c = this.mClientsValues[i]; 
         if (!c.IsDisconnected && !c.ReadingInProgress) 
         { 
          sockets.Add(c.Socket); 
         } 
        } 
        if (sockets.Count == 0) 
        { 
         // noClients = true; 
         continue; 
        } 
       } 
       finally 
       { 
        this.mClientsSynchronization.ReleaseReaderLock(); 
       } 
       try 
       { 
        //System.Net.Sockets.Socket.Select(sockets, null, null, RECEIVE_DATA_TIMEOUT); 
        SocketSelect.Select(sockets, null, null, RECEIVE_DATA_TIMEOUT); 
        foreach (System.Net.Sockets.Socket s in sockets) 
        { 
         Client c = this.mClients[s]; //mClients-dictionary<socket,client> 
         if (!c.SetReadingInProgress()) 
         { 
          System.Threading.ThreadPool.QueueUserWorkItem(c.ReadData); 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        this.OnExceptionCaught(this, new ExceptionCaughtEventArgs(e, "Exception when reading data.")); 
       } 
      } 
     } 

Répondre

1

La liste des sockets est utilisée dans la boucle pour extraire les objets Client encore connectés de mClients. La liste des sockets est effacée à chaque itération de la boucle, de sorte que mClients peut être vérifié pour exclure tous les clients ou clients déconnectés dont la lecture est déjà en cours. En retirant le mécanisme de verrouillage du fil et l'appel SocketSelect, la boucle se réduit au code ci-dessous, ce qui peut être plus facile à comprendre.

mClients.Where(c => !c.IsDisconnected && !c.ReadingInProgress).ToList().ForEach(c=> { 
    if (!c.SetReadingInProgress()) { 
     ThreadPool.QueueUserWorkItem(c.ReadData);       
    } 
});