我正在研究一个项目,您必须在其中从服务器检索数据并将其显示在UI中。这是一个新闻组服务器,总共包含约250个组。
据我所知,服务器的输出应该存储在NetworkStream对象中,并从StreamReader读取,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;
}
答案 0 :(得分:1)
我很想在第一行上看到有关丢弃的数据的哪些信息(“ 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();
}