2011-08-21 6 views
2

J'ai construit un serveur qui reçoit des requêtes d'un client et donne une réponse qui dépend du type de requête. Si le type de requête est en streaming, le serveur doit envoyer un tableau de données. Pendant le streaming des données du serveur, le client peut envoyer une demande d'arrêt pour arrêter le streaming. Si la demande et la réponse sont transférées sur la même connexion TCP, le serveur reçoit uniquement la demande d'arrêt lorsque toutes les données ont été transmises au client. Je pense que je dois utiliser l'écriture asynchrone pour résoudre ce problème. Ceci est mon code:C# Lecture et écriture asynchrones avec NetworkStream

D'abord, je crée une boucle de retour pour recevoir la connexion des clients:

while (!done) 
{ 
     try 
     { 
      Socket socket = listener.AcceptSocket(); 
      ClientInteraction clIr = new ClientInteraction(socket, statusList); 
      Thread thread = new Thread(new ThreadStart(clIr.Process)); 
      thread.Start();          
     } 
     catch (Exception ex) 
     { 
       Console.WriteLine(ex.ToString()); 
     } 
     } 
} 

En fonction de processus de classe ClientInteraction:

Public void Process() 
{ 
      ns = new NetworkStream(socket); 
      while (true) 
      { 
       try 
       { 

         this.myReadBuffer = new byte[socket.ReceiveBufferSize]; 
         this.numberOfBytesRead = ns.Read(myReadBuffer, 0, myReadBuffer.Length); 

       } 
       catch 
       { 
        break; 
       } 
       if (numberOfBytesRead == 0) 
       { 
        break; 
       } 
       else 
       { 

        HandleRequest(myReadBuffer, numberOfBytesRead); 

       } 
      } 
} 

En HandleRequest Fonction, si le flux de demande, Je vais envoyer des données dans un tableau au client:

Public void HanldeRequest(……) 
{ 
    myCompleteMessage = ""; 
    myCompleteMessage = 
       String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); 
    If(myCompleteMessage == “Stream”) 
    { 
     //I get data and call SendData function 
      foreach(.......) 
      { 
       //get data 
       ........ 
      SendData(data); 
      } 
    } 
}   
    public void SendData(byte[] data) 
     { 
      try 
      { 
       //ns.Write(data, 0, data.Length); 
       ns.BeginWrite(data, 0, data.Length, new AsyncCallback(StreamData), null); 
      } 
      catch 
      { 

      } 
     } 

     public void StreamData(IAsyncResult asynResult) 
     { 
      if(asynResult != null) 
       ns.EndWrite(asynResult); 
     } 

Avec ce code, Je me suis connecté avec le client, envoyer des données au client. Mais je ne peux toujours pas recevoir de demande d'arrêt tant que toutes les données n'ont pas été diffusées. S'il vous plaît montrez-moi la bonne façon de résoudre mon problème. Je vous remercie.

Répondre

0

Je pense que vous pouvez essayer d'utiliser multithread pour résoudre ce problème. J'ai rencontré cette circonstance et multithread est un bon choix à résoudre. Vous pouvez créer un fil à écrire et un fil à lire.

Questions connexes