2009-11-18 7 views
1

De nombreux tutoriels sur la communication socket que je vois semblent utiliser 1 thread par socket. Mais sur un serveur utilisé pour les jeux en ligne, vous pourriez avoir 10k utilisateurs simultanés - 10k threads n'est pas une idée merveilleuse. Je suis tombé sur un outil (SmartFox) qui prétend utiliser un seul thread pour surveiller toutes les connexions socket, potentiellement des milliers d'entre eux. Cette application se trouve être en Java, mais je pense que C++ ou C# pourrait faire la même chose ... comment y arriveriez-vous?Maintien de nombreuses connexions socket avec un seul thread

+0

Super lien, je vais le lire en détail plus tard. Pourquoi avez-vous ajouté ceci comme commentaire, pas une réponse? –

Répondre

0

Implémentez un en file d'attente système avec un thread interrogeant le réseau et x threads agissant en tant que travailleurs. Vous devrez implémenter une section critique autour du code qui supprime et met en file d'attente les connexions.

+0

Ah, oui ce vieux modèle. Une solution évidente, j'aurais dû voir cela vu que je l'ai utilisé dans le passé. –

+0

Découvrez java.nio.channels.Selector pour l'utiliser dans le thread qui interroge les sockets. –

0

Si vous utilisez C++, regardez boost :: asio.

Faire le vôtre est amusant, bien sûr.

0

Puisque vous avez mentionné C++ ...

Si vous êtes sur une plate-forme Windows, alors vous devriez regarder dans les ports d'achèvement d'E/S pour ce genre d'évolutivité. Les ports d'achèvement d'E/S vous permettent d'effectuer des E/S asynchrones sur des sockets (et d'autres périphériques) en utilisant un petit nombre de threads pour gérer plusieurs milliers d'opérations d'E/S (connexions). La façon dont cela fonctionne est que le port d'achèvement d'E/S est essentiellement une file d'attente mais le système d'exploitation optimise la façon dont les threads sont libérés pour travailler sur les éléments de travail dans cette file d'attente afin d'éviter que trop de threads soient libérés simultanément. Assurez-vous qu'un thread qui vient d'être utilisé est plus susceptible d'être utilisé à nouveau. Voir ici: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx pour les informations MSDN sur IOCP et ici: http://www.serverframework.com/products---the-free-framework.html pour le code source de mon infrastructure client/serveur gratuit qui utilise IOCP sous les couvertures. Comme exemple de l'évolutivité possible, dans ce blog (http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html), je détaillerai comment j'ai pu réaliser plus de 70 000 connexions simultanées sur une machine Windows Server 2003 avec seulement 760 Mo de RAM. Notez que les opérations de socket async C# utilisent des IOCP sous le capot.

Questions connexes