StreamReader 不会从 NetworkStream 中检索所有内容(TCP 和 C#)

StreamReader doesn't retrieve everything from NetworkStream (TCP and C#)

我正在做一个项目,您必须从服务器检索数据并将其显示在 UI 中。它是一个新闻组服务器,总共包含大约 250 个组。

据我所知,服务器的输出应该存储在 NetworkStream 对象中,并从 StreamReader 中读取,后者将每一行保存为一个字符串。

这行得通,但不幸的是,它似乎在完成方法调用之前并没有读完所有内容。

下次我调用另一个命令并从 StreamReader 读取它,然后 returns 上一个命令的其余输出。

我已经为此苦苦挣扎了几个小时,不知道如何解决这个问题。

这是我的代码:

    public ObservableCollection<Newsgroup> GetNewsGroups()
    {
        ObservableCollection<Newsgroup> newsgroups = new ObservableCollection<Newsgroup>();

        if(connectionStatus.Equals(ConnectionStatus.CONNECTED) && loginStatus.Equals(LoginStatus.LOGGED_IN))
        {

            byte[] sendMessage = Encoding.UTF8.GetBytes("LIST\n");

            // Write to the server 
            ns.Write(sendMessage, 0, sendMessage.Length);
            Console.WriteLine("Sent {0} bytes to server...", sendMessage.Length);

            ns.Flush();

            // b) Read from the server
            reader = new StreamReader(ns, Encoding.UTF8);

            // We want to ignore the first line, as it just contains information about the data
            string test = reader.ReadLine();

            Console.WriteLine(test);

            string recieveMessage = "";

            if (ns.CanRead)
            {

                while (reader.Peek() >= 0)
                {

                    recieveMessage = reader.ReadLine();
                    Console.WriteLine("Got this message {0} back from the server", recieveMessage);
                    // This part will simply remove the annoying numbers after the newsgroup name
                    int firstSpaceIndex = recieveMessage.IndexOf(" ");
                    string refactoredGroupName = recieveMessage.Substring(0, firstSpaceIndex);
                    newsgroups.Add(new Newsgroup { GroupName = refactoredGroupName });
                }

            }

        }

        return newsgroups;

    }

我很想知道关于您在第一行丢弃的数据的哪些信息("test" 变量中的内容)。如果它告诉您有多少字节即将到来,您应该使用该信息而不是 Peek 来检索正确的数据量。

如果最后一行包含单个句点,请将 while 循环更改为如下所示:

recieveMessage = reader.ReadLine();
while (recieveMessage != ".")
{ 
    Console.WriteLine("Got this message {0} back from the server", recieveMessage); // This part will simply remove the annoying numbers after the newsgroup name int 
    firstSpaceIndex = recieveMessage.IndexOf(" "); 
    string refactoredGroupName = recieveMessage.Substring(0, firstSpaceIndex);
    newsgroups.Add(new Newsgroup { GroupName = refactoredGroupName }); 
    recieveMessage = reader.ReadLine();
}