2014-07-23 1 views
0

J'écris une application client-serveur. La commande d'envoi du client et le serveur le reçoivent et font quelques manipulations. Ça marche bien. Mais quand j'essaye d'envoyer la réponse du serveur au client et le reçois du côté du client rien ne se produit. Même le serveur ne fait rien. Le programme se bloque et seul Shift + F5 aide à le terminer.L'application client-serveur ne fait rien lorsque j'essaie d'obtenir une réponse du serveur C#/

Code Serveur:

class TNPClient 
{ 
    TNPBaseInterraction tnp_base; 

    private void SendError(TcpClient Client, int Code) 
    { 
     byte[] buf = Encoding.ASCII.GetBytes(Code.ToString()); 
     Client.GetStream().Write(buf, 0, buf.Length); 
     Client.Close(); 
    } 

    private void SendResponse(TcpClient Client, string response) 
    { 
     byte[] buf = Encoding.ASCII.GetBytes(response); 
     Client.GetStream().Write(buf, 0, buf.Length); 
     Client.Close(); 
    } 

    void ParseMonitorRequest(TcpClient Client, string req) 
    { 
     MessageBox.Show("inside parser"); 
     int term_id = Convert.ToInt32(req.Substring(2)); 
     switch (req[1]) 
     { 
      case '0': 
       List<MonitorStruct> monitors = tnp_base.GetMonitors(term_id); 
       foreach (MonitorStruct mon in monitors) 
       { 

       } 
       break; 
      case '1': 
       break; 
      case '2': 
       break; 
      case '3': 
       break; 
      case '4': 
       MessageBox.Show("inside 4"); 
       List<TerminalStruct> terminals = tnp_base.GetTerminals(); 
       foreach (TerminalStruct term in terminals) 
       { 
        MessageBox.Show("sending response"); 
        MessageBox.Show(string.Format("ID: {0} Address: {1} Comment: {2}", term.TerminalID, term.Address, term.Comment)); 
        //SendResponse(Client, string.Format("ID: {0} Address: {1} Comment: {2}", term.TerminalID, term.Address, term.Comment)); 
       } 
       break; 
     } 
    } 

    void ParseTerminalRequest(TcpClient Client, string req) 
    { 

    } 

    public TNPClient(TcpClient Client) 
    { 
     try 
     { 
      tnp_base = new TNPBaseInterraction("127.0.0.1", "tnp", "tnp_user", "tnp123", "3406"); 

      string Request = ""; 
      byte[] buf = new byte[1024]; 
      int Count = 0; 
      while ((Count = Client.GetStream().Read(buf, 0, buf.Length)) > 0) 
      { 
       Request += Encoding.ASCII.GetString(buf, 0, Count); 
      } 
      if (Request[0].Equals('0')) 
      { 
       ParseMonitorRequest(Client, Request); 
      } 
      else 
      { 
       ParseTerminalRequest(Client, Request); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception: " + ex.Message); 
     } 
    } 
} 

class TNPServer 
{ 
    TcpListener Listener; 
    int Port = 5252; 

    public TNPServer(int ServerPort) 
    { 
     int MaxThreadsCount = Environment.ProcessorCount * 4; 
     ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount); 
     ThreadPool.SetMinThreads(2, 2); 

     Port = ServerPort; 
    } 

    public void StartServer() 
    { 
     Listener = new TcpListener(IPAddress.Any, Port); 
     Listener.Start(); 
     while (true) 
     { 
      ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient()); 
     } 
    } 

    static void ClientThread(Object StateInfo) 
    { 
     new TNPClient((TcpClient)StateInfo); 
    } 

    ~TNPServer() 
    { 
     if (Listener != null) 
     { 
      Listener.Stop(); 
     } 
    } 
} 

code côté client (ce code donne problème):

try 
{ 
    TcpClient client = new TcpClient("127.0.0.1", 5365); 
    if (client.Connected) MessageBox.Show("Connected"); 
    byte[] buf = Encoding.ASCII.GetBytes(tbSendText.Text); 
    NetworkStream stream = client.GetStream(); 
    stream.Write(buf, 0, buf.Length); 
    // System.Threading.Thread.Sleep(5000); 

    //client.ReceiveTimeout = Convert.ToInt32(TimeSpan.FromSeconds(1).TotalMilliseconds); 
    byte[] buffer = new byte[256]; 
    int Count = 0; 
    string response = string.Empty; 
    // while ((Count = client.GetStream().Read(buffer, 0, buffer.Length)) > 0) 
    //{ 
     Count = stream.Read(buffer, 0, buffer.Length); 
     response = Encoding.ASCII.GetString(buffer, 0, Count); 
    //} 

     stream.Close(); 
    client.Close(); 
    MessageBox.Show(response); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

Tous les messages sur le côté serveur sont affichés alors je ne suis pas essayer d'obtenir une réponse sur le côté client . Lorsque j'essaie d'obtenir une réponse, aucun message n'est affiché, mais la connexion est établie.

Répondre

1

Côté serveur, la boucle de lecture est bloquée pour toujours. Vous devez lire uniquement jusqu'à la longueur du texte & puis analyser la requête. Vous pouvez écrire la longueur du texte du côté client & puis écrire le contenu.