从TCP / IP读取循环

时间:2012-06-11 06:38:06

标签: c# tcp-ip

我需要连接一个服务器(带有ip和port)并创建一个读取循环,它将从服务器以XML格式获取消息。有时没有来自服务器的消息。

我尝试创建连接(工作正常)并阅读消息,我从服务器获取第一条消息,当我尝试读取另一条消息时 - 它会卡住。我想也许现在可能没有消息,但我需要循环才会继续,直到有消息......它甚至不会“捕获”或“终于”,只是什么都不做..

public class Connection
{
    public Connection()
    {
        Socket server = null;
        try
        {
            string p = string.Empty;
            using (var client = new TcpClient(myIPAddress, myPort))
            using (var stream = client.GetStream())
            using (var reader = new StreamReader(stream))
            {
               while (p != null)
               {
                    try
                    {
                        p = reader.ReadLine();
                    }
                    catch (Exception e)
                    {
                       //
                    }
               }
            }
        }
        catch (Exception e)
        {
            //
        }
        finally { 
            server.Close(); 
        }
    }
}

2 个答案:

答案 0 :(得分:5)

循环 继续,等待数据。这里的问题似乎只是ReadLine()是阻塞调用。你提到可能还没有消息;好吧,ReadLine()将阻止,直到满足以下两个条件之一:

  • 它可以成功读取一些数据,由换行符终止(或EOF,即没有换行符后跟套接字关闭的消息) - 在这种情况下它会返回数据行
  • 不再收到数据该流已关闭,在这种情况下,它会返回null

基本上,ReadLine()将等待消息进入或套接字关闭。这只是ReadLine()的行为。如果这有问题,您可以更接近套接字,并检查NetworkStream.DataAvailable :请注意,这只会告诉您某些数据当前是否可用;它并不意味着“这是一个完整的消息”,也不能用于判断更多消息到达。 DataAvailable的主要用途是决定同步和异步访问。另外,如果您在插座附近工作,则必须进行所有自己的缓冲和编码/解码。

我认为ReadLine()正在成功运作。我在这里唯一要做的就是重新说一下:

string line;
while((line = reader.ReadLine()) != null) {
    // line is meaningful; do something
}

最后一个想法:xml并不总是简单地在“每行”的基础上简单地拆分成消息。您可能想要考虑其他形式的框架,但这可能意味着更接近套接字,而不是StreamReader

答案 1 :(得分:-2)

你必须等到数据到达流,你可以尝试使用follwing,

if(reader.EndOfStream)
   continue;