2016-08-03 1 views
-1

J'ai fait un simple serveur d'écoute tcp auquel je me connecte depuis mon téléphone mobile pour contrôler mon plafonnier. Mais chaque maintenant et puis il se coince à un StreamReader.ReadLine du client connectiongC# TcpListener streamreader.readline est bloqué

TcpListener listener = new TcpListener (IPAddress.Any, 8001); 
     listener.Start(); 


     //--------------------------MAIN LOOP-------------------------- 
     while (true) 
     { 

      //Recieve connection and take care of response 
      Console.WriteLine ("Awaiting connection"); 

      TcpClient client = listener.AcceptTcpClient(); 
      Console.WriteLine ("Client accepted"); 

      StreamReader sr = new StreamReader (client.GetStream()); 
      Console.WriteLine ("1:3"); 

      StreamWriter sw = new StreamWriter (client.GetStream()); 
      Console.WriteLine ("1:4"); 

      string fullrequests = "/no/request/value"; 
      Console.WriteLine ("1:5"); 


      fullrequests = sr.ReadLine(); <---- IT'S STUCK HERE 
      Console.WriteLine ("1:6"); 

Il est coincé pour que « 1: 6 » n'est imprimé à l'écran. Si je recharge la connexion de mon téléphone, il passe et redémarre mais reste au même endroit. Si je me faufile dans une autre connexion d'un autre appareil entre les deux, il y a une chance que cela redevienne normal. Des idées sur pourquoi c'est ou comment le contourner?

+0

Envoyez-vous une chaîne avec un caractère de nouvelle ligne (s) à la fin? – Stilgar

+0

cette ligne attend la chaîne entrante avec "\ n" à la fin. –

+0

'ReadLine()' est la méthode de blocage. Il bloquera jusqu'à ce que la ligne arrive (message texte avec '" \ xD \ xA "' à la fin). Vous pouvez essayer de définir le délai, lire de manière asynchrone ou lire octets/chaîne .. mais pas la ligne. Le plus facile est probablement de vérifier avant de lire. – Sinatr

Répondre

-2

Dans votre boucle, vous pouvez vérifier client.Available - s'il y a des données entrantes, ce sera plus grand que 0, et alors vous pouvez lire.

J'ai construit une bibliothèque et un paquet NuGet autour de la simplification il n'y a pas si longtemps; Je passais plus de temps à rendre les sockets heureux que je faisais des progrès sur les applications. Il pourrait vous aider à regarder le code pour cela à titre de référence; Bien que ce ne soit pas un brillant exemple de performance, il fonctionne très bien pour gérer quelques connexions socket dans une application.

https://github.com/BrandonPotter/SimpleTCP/blob/master/SimpleTCP/Server/ServerListener.cs

  List<byte> bytesReceived = new List<byte>(); 

      while (c.Available > 0 && c.Connected) 
      { 
       byte[] nextByte = new byte[1]; 
       c.Client.Receive(nextByte, 0, 1, SocketFlags.None); 
       bytesReceived.AddRange(nextByte); 

       if (nextByte[0] == _delimiter) 
       { 
        byte[] msg = _queuedMsg.ToArray(); 
        _queuedMsg.Clear(); 
        _parent.NotifyDelimiterMessageRx(this, c, msg); 
       } else 
       { 
        _queuedMsg.AddRange(nextByte); 
       } 
      } 

NuGet Package

+0

Cela semble très bien et je vais regarder dans le. Pour une raison quelconque, je ne peux pas changer cette réponse. –