2016-03-10 1 views
1

Je ces deux méthodes:DataAvailable est faux, mais plus de données aurait dû être envoyé

public QueryResult ListenForConnection() 
    { 
     if (!ServerStarted) 
     { 
      IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
      Listener = new TcpListener(ipAddress, 4044); 
      Listener.Start(); 
      ServerStarted = true;     
      while (true) 
      { 
       Thread.Sleep(10); 
       TcpClient tcpClient = Listener.AcceptTcpClient(); 
       byte[] requestByteBuffer = new byte[1024]; 
       NetworkStream stream = tcpClient.GetStream(); 
       stream.Read(requestByteBuffer, 0, requestByteBuffer.Length); 
       string httpMessage = Encoding.ASCII.GetString(requestByteBuffer, 0, requestByteBuffer.Length); 
       Query query = JsonConvert.DeserializeObject<Query>(httpMessage); 
       QueryResult queryResult = QueryService.ExecuteQuery(query); 
       string queryResultJson = JsonConvert.SerializeObject(queryResult); 
       byte[] responseByteBuffer = new byte[1024]; 
       responseByteBuffer = Encoding.ASCII.GetBytes(queryResultJson); 
       stream.Write(responseByteBuffer, 0, responseByteBuffer.Length); 
       stream.Flush(); 

      } 
     } 
     else 
     { 
      return new QueryResult("Failed", null, null); 
     } 


    } 

et

public QueryResult ProcessRemoteQuery(Query query) 
    { 
     Byte[] byteBuffer = new Byte[1024]; 
     string jsonSerializedQuery = JsonConvert.SerializeObject(query); 
     byteBuffer = Encoding.ASCII.GetBytes(jsonSerializedQuery); 
     NetworkStream stream = Client.GetStream(); 
     stream.Write(byteBuffer, 0, byteBuffer.Length); 
     stream.Flush(); 
     Byte[] responseByteBuffer = new Byte[1024]; 
     int responseBytes = stream.Read(responseByteBuffer, 0, responseByteBuffer.Length); 
     string jsonDeserializedQueryResult = Encoding.ASCII.GetString(responseByteBuffer, 0, responseBytes); 
     QueryResult response = JsonConvert.DeserializeObject<QueryResult>(jsonDeserializedQueryResult); 
     return response; 
    } 

Pour une raison quelconque, DataAvailable est faux dans ProcessRemoteQuery, ce qui signifie stream.Read() ne retourne jamais et bloque mon application. Ce qui est bizarre, c'est que cela n'arrive que la deuxième fois, donc le premier ProcessRemoteQuery fonctionne bien, mais le second ne le fait jamais. Y a-t-il un bug avec le code ici? Je n'ai pas inclus le code qui initialise réellement le client, mais je vous assure que c'est fait. Il semble que ListenForConnection devrait définitivement renvoyer des données à chaque fois? Toute aide est appréciée, merci.

+0

Vous avez toujours un bug dans 'ListenForConnection' - aucun code de socket ne devrait jamais ignorer la valeur de retour de' Read'. Vous n'avez peut-être reçu qu'un octet. Il n'y a pas d'association 1-1 entre 'Write's d'un côté et' Read's de l'autre côté. Si vous voulez * messager *, c'est à * vous * de l'implémenter (c'est-à-dire des messages de taille fixe, une sorte de cadrage, etc.) ou de passer à une abstraction de plus haut niveau que TCP, qui est juste un flux d'octets. –

Répondre

0

Donc j'étais très très bête, et l'avais changé récemment pour que le client ne se connecte pas à chaque fois. Listener.AcceptTcpClient attendait un nouveau client après l'envoi du premier message, et n'en obtenait jamais un, bloquant le tout.

+0

Est-ce que cela signifie que vous avez résolu votre problème? –

+0

Oui, j'ai depuis refaisé la logique de connexion de toute façon. –