2016-11-11 2 views
0

Я тестирую приложение, в котором я подключаюсь к серверу с TcpClient, отправляя строки и ожидая ответа. Это работает при переходе через приложение, но при запуске без контрольных точек результат пуст.Проблема при подключении к серверу через TcpClient

Конкретно: Я хочу связаться с сервером TS3. Вот код:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var response = new ServerConnection().GetResponse(); 
     Console.WriteLine("Response erhalten!"); 
     Console.WriteLine(response); 
     Console.ReadKey(); 
    } 
} 

public class ServerConnection 
{ 
    public string GetResponse() 
    { 
     string result = ""; 
     using (var client = new TcpClient()) 
     { 
      client.Connect(IPAddress.Parse("193.111.136.17"), 10011); 
      using (var ns = client.GetStream()) 
      { 
       byte[] bytesToSend; 
       bytesToSend = Encoding.ASCII.GetBytes("help"); 
       ns.Write(bytesToSend, 0, bytesToSend.Length); 
       byte[] response = new byte[1024]; 
       if (ns.DataAvailable) 
        ns.Read(response, 0, response.Length); 

       using (var ms = new MemoryStream(response)) 
       { 
        using (var sr = new StreamReader(ms)) 
        { 
         result = sr.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return result; 
    } 
} 

Может кто-нибудь сказать мне, ПОЧЕМУ АДА réponse заполнена \0 при его запуске в обычном режиме (в результате пустого текста для result), но содержащее некоторые «полезного» текст, когда пошаговый это? Это сводит меня с ума ... aaarg !!

Заранее благодарен!

+0

Вы останавливаетесь только на 'result = sr.ReadToEnd();' и если нет, может быть, вы не дожидаетесь достаточно долго, чтобы возвращаемый ответ работал нормально? – vipersassassin

+0

Знаете ли вы, сколько времени сервер должен отвечать между записью и чтением? Вы пытались сделать некоторые промежуточные выходы, чтобы проверить, действительно ли вы когда-либо попадали в условие 'if (ns.DataAvailable)? возможно, асинхронный подход будет более уместным? –

+0

Я сделал свою точку останова на методе connect() клиента – Radinator

ответ

1

Метод блокировки, нет необходимости проверять значение свойства NetworkStream.DataAvailable.

Если ваш код выполняет «слишком быстро», значение свойства NetworkStream.DataAvailable может быть false, поэтому данные не будут считаться из потока.