带有eventhandler的C#TcpClient streamreader并未处理所有消息

时间:2015-11-09 09:13:06

标签: c# xml events stream tcpclient

我正在从TcpClient流读取器连续读取。 来自流的数据是原始XML。没有消息框架。因此,现在有可靠的方法来知道消息何时完成。虽然我只有3条来自服务器的XML消息。但是当他们来的时候还不得而知。我无法配置/编程服务器。 到目前为止,这是我的代码。

        public void Start()
    {
        StreamReader reader = new StreamReader(_tcpClient.GetStream());
        char[] chars = new char[Int16.MaxValue];
        while (!_requestStop)
        {
            try
            {
                while ((reader.Read(chars, 0, chars.Length)) != 0)
                {
                    string s = new string(chars);
                    s = removeEmptyChars(s);
                    if (s.IndexOf("<foo", StringComparison.OrdinalIgnoreCase) > 0 &&
                        s.IndexOf("</foo>", StringComparison.OrdinalIgnoreCase) > 0)
                    {
                        Console.WriteLine(s);
                        OnAlarmResponseComplete(new CustomEventArgs(s));
                    }
                    if (s.IndexOf("<bar", StringComparison.OrdinalIgnoreCase) > 0 &&
                        s.IndexOf("</bar>", StringComparison.OrdinalIgnoreCase) > 0)
                    {
                        Console.WriteLine(s);
                        OnAckComplete(new CustomEventArgs(s));
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                //break;
            }
        }
        reader.Close();
        Console.WriteLine("Stopping TcpReader thread!");
    }

然后在我的主线程中,我正在处理事件。我正在将它们添加到列表中。 我在哪里处理清单。 当我调试我的应用程序时,我将收到10个foo和10 bar的消息。在我的列表中,我只存储了1条foo和1条消息。

事件处理程序是否会减慢处理速度?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

以下是您应该用来涵盖各种输入问题的代码(foo或bar部分收到,foo和bar一起收到等等。)

我不能说我批准使用字符串解析来处理XML内容,但无论如何。

private static string ProcessAndTrimFooBar(string s, out bool foundAny)
{
    foundAny = false;

    int fooStart = s.IndexOf("<foo", StringComparison.OrdinalIgnoreCase);
    int fooEnd = s.IndexOf("</foo>", StringComparison.OrdinalIgnoreCase);
    int barStart = s.IndexOf("<bar", StringComparison.OrdinalIgnoreCase);
    int barEnd = s.IndexOf("</bar>", StringComparison.OrdinalIgnoreCase);

    bool fooExists = fooStart >= 0 && fooEnd >= 0;
    bool barExists = barStart >= 0 && barEnd >= 0;

    if ((fooExists && !barExists) || (fooExists && barExists && fooStart < barStart))
    {
        string fooNodeContent = s.Substring(fooStart, fooEnd - fooStart + 6);
        s = s.Substring(fooEnd + 6);
        Console.WriteLine("Received <foo>: {0}", fooNodeContent);
        OnAlarmResponseComplete(new CustomEventArgs(fooNodeContent));
        foundAny = true;
    }

    if ((barExists && !fooExists) || (barExists && fooExists && barStart < fooStart))
    {
        string barNodeContent = s.Substring(barStart, barEnd - barStart + 6);
        s = s.Substring(barEnd + 6);
        Console.WriteLine("Received <bar>: {0}", barNodeContent);
        OnAckComplete(new CustomEventArgs(barNodeContent));
        foundAny = true;
    }

    return s;
}

public static void Start()
{
    StreamReader reader = new StreamReader(_tcpClient.GetStream());
    char[] chars = new char[Int16.MaxValue];
    while (!_requestStop)
    {
        try
        {
            int currentOffset = 0;
            while ((reader.Read(chars, currentOffset, chars.Length - currentOffset)) != 0)
            {
                string s = new string(chars).TrimEnd('\0');

                bool foundAny;

                do
                {
                    s = ProcessAndTrimFooBar(s, out foundAny);
                } while (foundAny);

                chars = s.PadRight(Int16.MaxValue, '\0').ToCharArray();
                currentOffset = s.Length;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            //break;
        }
    }
    reader.Close();
    Console.WriteLine("Stopping TcpReader thread!");
}