2009-02-27 5 views
0

J'ai une application serveur (singleton, simple application console .NET) qui parle à un GlobalCache GC-100-12 dans le but de router des commandes IR. Divers clients .NET WinForm sur le réseau local se connectent à mon application serveur et y envoient des commandes ASCII. L'application serveur met en file d'attente ces commandes ASCII, puis les envoie au GC-100-12 via une connexion TCP.Quelle est la manière préférée de gérer cette connexion TCP en C#?

Ma question est, quelle est la meilleure façon de gérer cette connexion du point de vue du serveur? Je peux penser à deux façons:

  1. Créer et ouvrir un nouveau TcpClient pour chaque demande individuelle. Fermez le TcpClient lorsque la requête est terminée.

  2. Créez et ouvrez un TcpClient au démarrage du serveur et utilisez un keep-alive (si nécessaire) pour maintenir la connexion ouverte pendant la durée de vie de l'objet serveur.

Je pose cette question parce que je me demande au sujet de la tête de créer une nouvelle TcpClient pour chaque demande. Est-ce une opération coûteuse? Est-ce une mauvaise pratique?

Actuellement, je fais # 1, et l'impression des résultats de chaque transmission à la console. Parfois, certaines connexions timeout et la commande ne sont pas routées, et je me demandais si c'était à cause de la surcharge de créer une nouvelle TcpConnection à chaque fois, ou si cela est dû à quelque chose d'autre.

Je peux voir le # 2 étant plus compliqué parce que si la connexion tombe, elle doit être recréée, et cela nécessitera un peu plus de code pour gérer cette circonstance.

Je suis à la recherche de conseils généraux à ce sujet. Je n'ai pas beaucoup d'expérience de travail avec la classe TcpClient.

Répondre

3

Nous avions un cas similaire d'ouverture d'une session telnet à un ancien système basé sur PICK. Nous avons constaté que le coût d'ouverture de la connexion TCP chaque fois qu'une demande arrivait était assez cher, et nous avons décidé d'implémenter une routine sans opération pour garder la connexion ouverte. C'est plus complexe, mais tant que votre point de terminaison n'essaie pas de servir beaucoup de clients, épingler une connexion semble une solution viable.

Vous pouvez également configurer d'avoir un délai d'attente, si vous voulez éviter garder une connexion ouverte quand il n'y a pas de trafic. Cinq minutes d'inactivité, puis fermez la connexion.

Questions connexes