获取新闻服务器中的组列表






3.75/5 (8投票s)
2003年7月2日
2分钟阅读

65731

172
套接字编程入门
引言
本文将向您介绍 .NET 中的套接字编程,并通过一个实际应用来演示:获取新闻服务器上的所有群组。为了完全理解本文,您应该具备一些关于套接字编程的知识。
使用代码
为了说明这些内容,我们将创建一个表单,该表单从新闻服务器(例如 news.microsoft.com – 我所知的最好且免费的新闻服务器)获取所有群组,并将结果放入一个富文本框中。 我们的表单将通过 TCP 协议连接到服务器,并使用 NNTP 协议与其通信(您应该参考 RFC 977,网址为 www.faqs.org,以获取有关 NNTP 协议的更多信息。它相当简单)。以下是主要源代码
private void clickGo(object sender, System.EventArgs ex)
{
// Connect to server;
TcpClient tcpClient = new TcpClient();
tcpClient.Connect("news.microsoft.com", 119);
NetworkStream networkStream = tcpClient.GetStream();
StreamReader reader = new StreamReader(networkStream);
StreamWriter writer = new StreamWriter(networkStream);
string s;
reader.ReadLine(); // Server respones = "200 Server ready"
writer.WriteLine("List");
writer.Flush();
s = reader.ReadLine(); // Server response = "215 Newsgroups follow"
while (s != ".") // "." response means that the list comes to the end
{
s = reader.ReadLine();
if (s != ".")
{
s = s.Substring(0,s.IndexOf(' '));
textList.Text = textList.Text+s+"\n";
}
}
// Disconnect
networkStream.Close();
tcpClient.Close();
}
首先,我们使用以下行连接到服务器并打开一个新的流:
TcpClient tcpClient = new TcpClient();
tcpClient.Connect("news.microsoft.com", 119);
NetworkStream networkStream = tcpClient.GetStream();
networkStream
现在纯粹是一个二进制流;因此,使用起来非常困难。我们将使用以下代码将其转换为基于文本的流
StreamReader reader = new StreamReader(networkStream);
StreamWriter writer = new StreamWriter(networkStream);
剩下的工作是在 NNTP 协议中与服务器通信,以获取群组列表,这与在控制台窗口中读取和写入的方式没有区别。我们可以想象服务器是一个真正的人,只能用 NNTP 语言交流。
s1 = reader.ReadLine();
writer.WriteLine("List");
writer.Flush();
s2 = reader.ReadLine();
有一件事您应该注意:您必须在从服务器读取之前刷新缓冲区。例如,当您命令服务器发送群组列表时
writer.WriteLine("List"); // without flush
“List”命令存储在缓冲区中,而不是立即发送到服务器,而且,服务器当然不会收到“List”命令。当您从服务器读取答案时:
s2 = reader.ReadLine();
您的应用程序将挂起,因为服务器只是等待您的命令。因此,请记住在读取服务器的答案之前必须调用 Flush
。
最终注释
如果您通过 56k 调制解调器下载列表,则需要两三分钟才能完成。请耐心等待! 为了保持源代码的简洁,我假设在建立连接或查询服务器时不会发生任何错误。我不是英语母语者。因此,我愿意接受您对本文的语法和风格的反馈。谢谢。