2009-08-17 7 views
1

je le code suivant pour l'application serveur:TCP Client Server Problème

 TcpListener recSock = new TcpListener(400); 
     recSock.Start(); 
     TcpClient client = recSock.AcceptTcpClient(); 
     NetworkStream netStream = client.GetStream(); 

     Byte[] data = new Byte[256]; 

     int i; 

     while((i = netStream.Read(data, 0, data.Length)) != 0) { 
      string cmd = ASCIIEncoding.ASCII.GetString(data, 0, i); 
      Console.WriteLine(cmd); 
      if(cmd == "R") { 
       RestartScheduler(); 
      } 
     } 

     client.Close(); 

Et le client ressemble à:

 TcpClient client = new TcpClient(); 
     client.Connect("VM-SCHEDULER", 400); 
     NetworkStream netStream = client.GetStream(); 
     Byte[] data = ASCIIEncoding.ASCII.GetBytes("R"); 
     netStream.Write(data, 0, data.Length); 
     netStream.Flush(); 
     client.Close(); 

Tout est bien la première fois que le client se connecte le "R" La commande est lue et la méthode RestartScheduler() est appelée, mais toutes les commandes suivantes échouent jusqu'à ce que le serveur soit redémarré.

J'ai utilisé telnet pour me connecter au serveur après la première tentative et il est toujours en écoute sur le port.

Où vais-je mal?

EDIT:

En fait ce que je suis en train d'accomplir est que le serveur écoutera toujours, un client se connecte ensuite envoyer la commande « R » puis fermez la connexion. Le client doit pouvoir se connecter au serveur à tout moment pour émettre la commande. Il n'y aura qu'un seul client à la fois.

+0

Dans ce cas, s'il vous plaît voir ma réponse à jour. – badbod99

Répondre

0

Vous vous connectez plusieurs fois ou vous envoyez plusieurs commandes par la même connexion? Si vous pouviez fournir un programme complet mais complet pour démontrer le problème, cela aiderait vraiment. Je suppose que vous rencontrez des problèmes en raison de la lecture de plusieurs commandes à partir d'une seule connexion en une seule fois, mais il est difficile de savoir sans plus d'informations. N'oubliez pas qu'un seul appel à Write du client peut facilement entraîner plusieurs lectures à la fin du serveur - ou vice versa.

2

S'il n'y a pas de données à lire, netStream.Read renverra 0 et votre boucle while se fermera, en déconnectant le client de client.Close() ;. Vous n'avez rien dans votre code pour permettre au serveur de continuer à recevoir dans ce scénario.

Vous devez continuer à écouter les connexions jusqu'à ce que l'application soit arrêtée, alors mettez l'écoute et GetStream dans une boucle while. Puisque Stream.Read est un appel bloquant, vous devriez avoir quelques données pour la lecture de données pendant la boucle (à moins que le délai ne se produise). Sinon, il fermera la connexion et retournera à l'écoute d'un nouveau.

Note: Je n'ai inclus aucune erreur de gestion ici, vous devrez l'ajouter vous-même.

TcpListener recSock = new TcpListener(400); 
    recSock.Start(); 

    while (!stopping) 
    { 
     TcpClient client = recSock.AcceptTcpClient(); 
     NetworkStream netStream = client.GetStream(); 

     Byte[] data = new Byte[256]; 

     int i = netStream.Read(data, 0, data.Length); 

     while(i != 0) 
     { 
      string cmd = ASCIIEncoding.ASCII.GetString(data, 0, i); 
      Console.WriteLine(cmd); 
      if(cmd == "R") { 
       RestartScheduler(); 
      } 
      i = stream.Read(bytes, 0, bytes.Length); 
     } 

     client.Close(); 

     Thread.Sleep(1); // Will allow the stopping bool to be updated 
    } 

niveau module complémentaire:

private bool stopping = false; 

Dans votre fonction d'arrêt:

stopping = true; 
0

Eh bien, le serveur après la sortie de la première commande qu'il reçoit, non?

0

Au moins, vous manquez using déclarations:

TcpListener recSock = new TcpListener(IPAddress.Loopback, 400); 
recSock.Start(); 
using (TcpClient client = recSock.AcceptTcpClient()) 
{ 
    using (NetworkStream netStream = client.GetStream()) 
    { 
     Byte[] data = new Byte[256]; 

     int i; 

     while ((i = netStream.Read(data, 0, data.Length)) != 0) 
     { 
      string cmd = Encoding.ASCII.GetString(data, 0, i); 
      Console.WriteLine(cmd); 
      if (cmd == "R") 
      { 
       RestartScheduler(); 
      } 
     } 
    } 

    client.Close(); 
} 

et

using (TcpClient client = new TcpClient()) 
{ 
    client.Connect("VM-SCHEDULER", 400); 
    using (NetworkStream netStream = client.GetStream()) 
    { 
     Byte[] data = Encoding.ASCII.GetBytes("R"); 
     netStream.Write(data, 0, data.Length); 
     netStream.Flush(); 
    } 
    client.Close(); 
} 
Questions connexes