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

誰も私を伝えることができ、WHYをステップ実行するとき(resultのために空白のテキストを生じる)正常にそれを実行しているが、いくつかの「役に立つ」テキストを含むときREPONSEが\0で満たされているHELLこの?これは私を夢中にさせる... aaarg !!

ありがとうございます!

+0

'result = sr.ReadToEnd();でチェックするのを止めるだけですか?そうでない場合、正常に実行されているときに返された応答を待っていない可能性がありますか? – vipersassassin

+0

サーバーが書き込みと読み取りの間で応答する必要がある時間を知っていますか?あなたは実際に 'if(ns.DataAvailable)'状態に入るかどうかを確認するためにいくつかの中間出力を作成しようとしましたか?多分非同期アプローチがより適切だろうか? –

+0

クライアントのconnect()メソッドでブレークポイントを作成しました – Radinator

答えて

1

NetworkStream.Readメソッドがブロックしているため、NetworkStream.DataAvailableプロパティの値を確認する必要はありません。

コードが「あまりにも速く」実行された場合、NetworkStream.DataAvailableプロパティの値はfalseになる可能性があります。したがって、ストリームからデータが読み取られません。

関連する問題