Rebranchez TCPClient après l'interruption
J'ai plusieurs instances d'une application client, la connexion à une application principale sur internet par TcpClient. (Codée par moi). Si la connexion est faite comme:
TcpClient.Connexion(ip, port)
Je veux maintenant cette option pour gérer les différents type de déconnexion des événements:
- Principale de l'Application (serveur) ou une application client à l'ordinateur de perdre la connexion internet.
- Lors de la reprise de la connexion, la communication semble perdu, mais quand j'ai essayer de se reconnecter, j'obtiens le message:
"Une demande de connexion a été faite sur un socket déjà connecté" - Donc j'ai besoin de fermer et de redémarrer l'application cliente.
- Lors de la reprise de la connexion, la communication semble perdu, mais quand j'ai essayer de se reconnecter, j'obtiens le message:
- De l'Application principale (le serveur) est fermé et redémarré.
- Le redémarrage de l'Application Principale, et ensuite essayer de renouer le client app, les résultats dans la même erreur que ci-dessus.
Alors, que dois-je faire? Ai-je besoin d'instancier un Nouvel TcpClient dans les Applications clientes, chaque fois que ce type d'interruption se produire? Je n'ai pas essayé, donc ne sais pas si c'est une mauvaise solution?
Jetez un oeil sur ma solution: github.com/Mellen/Networking-Samples
Non, ne regardez pas ce client par exemple. Ne pas utiliser des threads de lecture à l'arrière-plan. Utiliser les méthodes asynchrones.
Non, ne regardez pas ce client par exemple. Ne pas utiliser des threads de lecture à l'arrière-plan. Utiliser les méthodes asynchrones.
OriginalL'auteur bretddog | 2011-05-06
Vous devez vous connecter pour publier un commentaire.
Oui. Si la connexion représentée par le TcpClient est cassé, vous ne pouvez pas utiliser cet objet pour plus de communication, et vous ne pouvez pas vous connecter à nouveau. Créer un nouvel objet TcpClient.
Votre problème est probable qu'une passerelle NAT fois votre connexion TCP, donc rien ne peut s'obtenir par le biais de votre serveur<->client, si tout ce que votre client n'est lu à partir de la connexion, il ne sera pas découvrir ce cas, et il pense que la connexion est toujours ouverte.
Oui. envoyer un certain type de battement de coeur de la connexion et attendre(avec un délai d'attente) pour une réponse
OriginalL'auteur nos
J'ai généralement résolu ce problème dans le passé par l'utilisation de threads. J'ai créé un contrôle de fil qui boucle et n'administratives des choses comme, vérifiez la connexion, vérifier les dernières entrées de l'utilisateur, vérifier un serveur de demande d'arrêt, etc. Quand c'est fait il a dormi pendant une demi-seconde et il l'a fait une fois de plus.
J'ai ensuite eu un autre thread Socket qui a été créé et simplement maintenu une prise réseau. Il allait ouvrir la connexion une fois commencé et en boucle à la recherche pour les messages entrants de qui il était connecté. Si il trouve un message qu'il aurait processus et de le stocker dans un contexte de volatilité collection d'objets de consommation par le contrôle de fil. Si quelque chose est arrivé à la connexion, il serait automatiquement essayer de le résoudre et si elle ne pouvait pas elle irait dans une "mort" de l'état. Le contrôle de fil à sa prochaine itération de nettoyer les morts prise de threads et d'en créer de nouveaux si nécessaire.
De débogage a été un cauchemar, mais il était étonnamment stable une fois que les bugs ont été résolus. Sur un cas, il a couru avec succès depuis plus d'un an avec des dizaines de milliers de connexions et des centaines de connexions simultanées sans besoin d'un redémarrage ou d'aucune maintenance.
Minuteur de threads et de Rappel threads sont gentils et tout, mais vous pourriez avoir plus de contrôle si vous écrivez votre propre fils. Un autre avantage, c'est que j'ai été en mesure de les compresser dans leur propre bibliothèque à la fois le client et le serveur avait, de sorte que le client peut gérer son propre serveur à des fins de débogage. En Plus je suis sûr qu'il ya des routines communes que le client et le serveur peuvent utiliser.
OriginalL'auteur maple_shaft