从TCP/IP读取循环

Tam*_*arG 2 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(); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

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

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

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

它看起来像是ReadLine()成功的工作.我在这里唯一要做的就是重新说一下:

string line;
while((line = reader.ReadLine()) != null) {
    // line is meaningful; do something
}
Run Code Online (Sandbox Code Playgroud)

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