2016-08-03 2 views
-1

Я создал простой сервер прослушивателя tcp, с которым я подключаюсь от своего мобильного телефона, чтобы управлять потолочным освещением. Но каждый сейчас и потом он застревает в streamreader.readline от клиента Подключение ПодключениеC# TcpListener streamreader.readline застрял

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"); 

Он застрял так, что «1: 6» никогда не печатается на экране. Если я перезагружу соединение с моего телефона, он пройдет мимо и перезапустится, но снова встанет на одно место. Если я прокрасться в другом соединении с другого устройства между ними, есть шанс, что он вернется к норме. Любые идеи о том, почему это или как обойти это?

+0

ли вы отправить строку с символом новой строки (ы) в конце? – Stilgar

+0

эта строка ожидает входящую строку с «\ n» в конце. –

+0

'ReadLine()' - метод блокировки. Он будет блокироваться до тех пор, пока не появится строка (текстовое сообщение с '' \ xD \ xA "' в конце). Вы можете попытаться установить тайм-аут, прочитать асинхронно или прочитать байты/строку .. но не строку. Проще всего, наверное, проверить перед чтением. – Sinatr

ответ

-2

В вашей петле вы можете проверить наличие client.Available - при наличии входящих данных оно будет больше 0, а затем вы сможете прочитать.

Я построил библиотеку и пакет NuGet вокруг упрощения этого не так давно; Я тратил больше времени на то, чтобы сделать сокеты счастливыми, чем я добился прогресса в приложениях. Это может помочь вам взглянуть на код для справки; в то время как это не яркий пример производительности, он отлично работает для обработки нескольких подключений сокетов в приложении.

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

Это кажется отличным, и я буду изучать его. По какой-то причине я не могу выдвинуть этот ответ. –

Смежные вопросы