StreamReader не получает все из NetworkStream (TCP и C #) - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над проектом, в котором вам нужно получить данные с сервера и отобразить их в пользовательском интерфейсе. Это сервер групп новостей, который содержит в общей сложности около 250 групп.

Вывод с сервера ДОЛЖЕН, насколько я понимаю, храниться в объекте NetworkStream и считываться из StreamReader, который сохраняет каждую строку в строку.

Это работает, но, к сожалению, похоже, что оно не заканчивает все чтение до завершения вызова метода.

В следующий раз, когда я вызываю другую команду и читаю ее из StreamReader, она возвращает остаток вывода предыдущей команды.

Я боролся с этим уже несколько часов и не могу понять, как это исправить.

Это мой код:

    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;

    }

1 Ответ

1 голос
/ 23 октября 2019

Мне было бы интересно посмотреть, какую информацию о данных вы выбрасываете в первой строке (что находится в переменной «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();
}
...