使用TcpClient和StreamReader无法接收多条消息

时间:2011-04-30 04:25:58

标签: c# tcpclient streamreader

我需要从服务器应用程序收到第二个回复。当我第一次连接到服务器应用程序时,我收到了回复。但是当我尝试发送另一条消息时,我无法收到它。

我尝试过寻找解决方案但我找不到任何东西。我相信问题是我的读者指针仍然在最后。这就是我无法阅读下一个回复的原因。这是我的代码:

public static void XConn()
{
    TcpClient client = new TcpClient();
    client.Connect("xxx.xxx.xxx.xxx",xx); // i cant show the IP sorry
    Stream s = client.GetStream();
    StreamReader sr = new StreamReader(s);
    StreamWriter sw = new StreamWriter(s);

    String r = "";
    sw.AutoFlush = true;      

    sw.WriteLine("CONNECT\nlogin:xxxxxxx \npasscode:xxxxxxx \n\n" + Convert.ToChar(0)); // cant show also

    while(sr.Peek() >= 0)
    {
        r = sr.ReadLine();
        Console.WriteLine(r);
        Debug.WriteLine(r);
        if (r.ToString() == "")
            break;
    }

    sr.DiscardBufferedData();

    //get data needed, sendMsg is a string containing the message i want to send
    GetmsgType("1");
    sw.WriteLine(sendMsg);

    // here i try to receive again the 2nd message but it fails =(
    while(sr.Peek() >= 0)
    {
        r = sr.ReadLine();
        Console.WriteLine(r);
        Debug.WriteLine(r);
        if (r.ToString() == "")
            break;
    }

    s.Close();

    Console.WriteLine("ok");
}

1 个答案:

答案 0 :(得分:0)

TcpClient.GetStream()返回NetworkStream,它不支持搜索,因此您无法更改读取器指针,只要连接打开,它就不会真正结束。这意味着当响应之间服务器出现延迟时,StreamReader.Peek()方法可能会返回误导性-1

获得响应的一种可靠方法是设置读取超时并保持循环直到抛出异常,您可以捕获并继续执行。该流仍然可用于发送另一条消息。

       s.ReadTimeout = 1000;

       try
       {
          sw.WriteLine(sendMsg);

          while(true)
          {
            r = sr.ReadLine();
            Console.WriteLine(r);
          } 

         sr.DiscardBufferedData(); 
       }
      catch(IOException)
       {
         //Timed out—probably no more to read
       }

<小时/> 更新:以下内容也可以使用,在这种情况下,您不必担心设置超时或捕获异常:

         while(true)
         {
           r = sr.ReadLine();
           Console.WriteLine(r);
           if (sr.Peek() < 0) break;
         }