2010-03-30 4 views
1

Nous écrivons un serveur socket en C# et ont besoin de conseils sur la conception. Contexte: Les clients (à partir d'appareils mobiles) se connectent à notre application serveur et nous laissons leur socket ouverte afin que nous puissions leur renvoyer des données quand nous en avons besoin. La quantité de données varie mais nous envoyons/recevons généralement des données de chaque client toutes les quelques secondes, donc c'est assez intensif. La quantité de connexions simultanées peut aller de 50 à 500 (et plus dans le futur).Sockets conseils de conception de serveur

Nous avons déjà écrit une application serveur utilisant des sockets asynchrones et cela fonctionne, mais nous avons rencontré des obstacles et nous devons nous assurer que ce que nous faisons est correct.

Nous avons une collection qui contient nos états client (nous n'avons pas de pool socket/connection pour le moment, devrions-nous?).

Chaque fois qu'un client se connecte, nous créons un socket, puis attendons qu'ils nous envoient des données et dans receiveCallBack nous ajoutons leur objet clienttate à notre dictionnaire de connexions (une fois que nous avons vérifié qui ils sont). Lorsqu'un objet client se déconnecte, nous fermons leur socket, puis le fermons et les retirons du dictionnaire de notre collection de clients.

On peut supposer que tout se passe dans le bon ordre, tout fonctionne comme prévu. Cependant, presque tous les jours, il arrête d'accepter les connexions, ou alors nous pensons, soit cela, soit il se connecte, mais il ne fait rien et nous ne pouvons pas comprendre pourquoi il s'arrête juste.

Il y a peu de choses que we'r'e incertain au sujet

1) Faut-il être la création d'une sorte de pool de connexion par opposition à juste un dictionnaire des sockets client

2) Qu'est-ce qui se passe à la les sockets qui se connectent mais ne sont pas ajoutées à notre dictionnaire, elles restent juste en mémoire en ne faisant rien, devrions-nous créer un autre dictionnaire qui contient les sockets dès qu'elles sont créées?

3) Quelle est la meilleure façon de savoir si les clients ne sont plus connectés? Nous avons lu plusieurs méthodes, mais nous ne sommes pas sûr de la meilleure à utiliser, envoyer des données ou lire des données, si oui, comment? 4) Si nous faisons une boucle sur les connexions dictonary pour vérifier les clients éliminés, devrions-nous verrouiller le dictionnaire, si oui, comment cela affecte-t-il d'autres objets clients essayant de l'utiliser en même temps, va-t-il lancer une erreur ou attends?

5) Nous recevons souvent dispoSocketException dans la méthode ReceiveCallBack à des moments aléatoires, cela signifie-t-il que nous sommes sûrs de retirer cette socket de la collection?

Nous ne pouvons pas trouver d'exemples de type de production qui montrent un fonctionnement de ce type.

Tout conseil serait grandement reçu

Répondre

0

4) Oui, le verrouiller. Les autres threads devront juste attendre.

En général, vous devez verrouiller le dictionnaire à chaque accès, y compris les lectures. Sinon, la structure peut être corrompue, ce qui est une cause possible de vos problèmes.

Questions connexes