65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.75/5 (8投票s)

2003年7月2日

2分钟阅读

viewsIcon

65731

downloadIcon

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 调制解调器下载列表,则需要两三分钟才能完成。请耐心等待!  为了保持源代码的简洁,我假设在建立连接或查询服务器时不会发生任何错误。我不是英语母语者。因此,我愿意接受您对本文的语法和风格的反馈。谢谢。

© . All rights reserved.