2

我需要连接一个服务器(使用 ip 和端口)并创建一个读取循环,该循环将从服务器获取消息作为 XML。有时没有来自服务器的消息。

我试图创建一个连接(工作正常)并阅读消息,我从服务器收到第一条消息,当我试图阅读另一条消息时 - 它卡住了。我认为现在可能没有消息,但我需要循环继续直到有消息......它甚至不会去“catch”或“finally”,什么都不做......

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(); 
        }
    }
}
4

2 回答 2

5

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

  • 它可以成功读取一些数据,以换行符终止(或 EOF,即没有换行符的消息后跟套接字关闭) - 在这种情况下,它返回数据行
  • 没有更多数据被接收并且流被关闭,在这种情况下它返回null

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

在我看来,它ReadLine()工作成功。我在这里唯一要做的就是重新措辞一下:

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

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

于 2012-06-11T07:18:55.103 回答
-2

您必须等到数据到达流中,您可以尝试使用以下方法,

if(reader.EndOfStream)
   continue;
于 2012-06-11T06:57:14.177 回答