2016-11-11 63 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; 
    } 
} 

誰能告訴我,憑啥運行時,它通常(導致空白文本result),但包含一些「有用」文本通過步進時效應初探充滿\0這個?這讓我發瘋了... aaarg!

提前致謝!

+0

你只是停下來檢查'result = sr.ReadToEnd();'如果不是,你是不是等待足夠長的時間才能正常運行返回的響應? – vipersassassin

+0

你知道服務器在寫入和讀取之間需要多長時間進行響應嗎?你有沒有試過做一些中間輸出來檢查你是否真的進入了'if(ns.DataAvailable)'狀態?也許一個異步的方法會更合適? –

+0

我在客戶端的連接()方法 – Radinator

回答

1

NetworkStream.Read方法被阻止,不需要檢查NetworkStream.DataAvailable屬性的值。

如果您的代碼「執行得太快」,則NetworkStream.DataAvailable屬性的值可能爲false,因此不會從流中讀取任何數據。