动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

 构造.NET环境下的网页下载器 (2)

作者:无从考证 来源:转载 
阅读 2363 人次 , 2006-2-15 14:25:00 

三.网页下载器实例介绍: 
   
    最后,我就综合以上.NET网络编程的一些知识,向大家展示一个很好的实例。该实例是一个运用Socket的基于同步模式的客户端应用程序,它首先通过解析服务器的IP地址建立一个终结点,同时创建一个基于流套接字的Socket连接,其运用的协议是TCP协议。通过该Socket就可以发送获取网页的命令,再通过该Socket获得服务器上默认的网页,最后通过文件流将获得的数据写入本机文件。这样就完成了网页的下载工作了,程序运行的效果如下所示: 
    
   
   
  程序的代码如下: 
   
  using System; 
  using System.Drawing; 
  using System.Collections; 
  using System.ComponentModel; 
  using System.Windows.Forms; 
  using System.Data; 
  using System.Net; 
  using System.Net.Sockets; 
  using System.Text; 
  using System.IO; 
   
  namespace SocketSample 
  { 
   ///  
   /// Form1 的摘要说明。 
   /// 
 
   
   public class Form1 : System.Windows.Forms.Form 
   { 
   private System.Windows.Forms.Label label1; 
   private System.Windows.Forms.Label label2; 
   private System.Windows.Forms.Button Download; 
   private System.Windows.Forms.TextBox ServerAddress; 
   private System.Windows.Forms.TextBox Filename; 
   ///  
   /// 必需的设计器变量。 
   /// 
 
   private System.ComponentModel.Container 
   components = null; 
   public Form1() 
   { 
   // 
   // Windows 窗体设计器支持所必需的 
   // 
   InitializeComponent(); 
   
   // 
   // TODO: 在 InitializeComponent 
   // 调用后添加任何构造函数代码 
   } 
   
   ///  
   /// 清理所有正在使用的资源。 
   /// 
 
   protected override void Dispose( bool disposing ) 
   { 
   if( disposing ) 
   { 
   if (components != null) 
   { 
   components.Dispose(); 
   } 
   } 
   base.Dispose( disposing ); 
   } 
   
   #region Windows Form Designer generated code 
   ///  
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
   /// 此方法的内容。 
   /// 
 
   private void InitializeComponent() 
   { 
   this.label1 = new System.Windows. 
   Forms.Label(); 
   this.label2 = new System.Windows. 
   Forms.Label(); 
   this.Download = new System.Windows. 
   Forms.Button(); 
   this.ServerAddress = new System.Windows. 
   Forms.TextBox(); 
   this.Filename = new System.Windows. 
   Forms.TextBox(); 
   this.SuspendLayout(); 
   // 
   // label1 
   // 
   this.label1.Location = new System.Drawing. 
   Point(16, 24); 
   this.label1.Name = "label1"; 
   this.label1.Size = new System.Drawing. 
   Size(80, 23); 
   this.label1.TabIndex = 0; 
   this.label1.Text = "服务器地址:"; 
   this.label1.TextAlign = System.Drawing. 
   ContentAlignment.MiddleRight; 
   // 
   // label2 
   // 
   this.label2.Location = new System.Drawing. 
   Point(16, 64); 
   this.label2.Name = "label2"; 
   this.label2.Size = new System.Drawing. 
   Size(80, 23); 
   this.label2.TabIndex = 1; 
   this.label2.Text = "本地文件名:"; 
   this.label2.TextAlign = System.Drawing. 
   ContentAlignment.MiddleRight; 
   // 
   // Download 
   // 
   this.Download.Location = new System. 
   Drawing.Point(288, 24); 
   this.Download.Name = "Download"; 
   this.Download.TabIndex = 2; 
   this.Download.Text = "开始下载"; 
   this.Download.Click += new System. 
   EventHandler(this.Download_Click); 
   // 
   // ServerAddress 
   // 
   this.ServerAddress.Location = new System. 
   Drawing.Point(96, 24); 
   this.ServerAddress.Name = "ServerAddress"; 
   this.ServerAddress.Size = new System. 
   Drawing.Size(176, 21); 
   this.ServerAddress.TabIndex = 3; 
   this.ServerAddress.Text = ""; 
   // 
   // Filename 

// 
   this.Filename.Location = new System. 
   Drawing.Point(96, 64); 
   this.Filename.Name = "Filename"; 
   this.Filename.Size = new System. 
   Drawing.Size(176, 21); 
   this.Filename.TabIndex = 4; 
   this.Filename.Text = ""; 
   // 
   // Form1 
   // 
   this.AutoScaleBaseSize = new System. 
   Drawing.Size(6, 14); 
   this.ClientSize = new System.Drawing. 
   Size(376, 117); 
   this.Controls.AddRange(new System.Windows. 
   Forms.Control[] { 
   this.Filename, 
   this.ServerAddress, 
   this.Download, 
   this.label2, 
   this.label1}); 
   this.Name = "Form1"; 
   this.Text = "网页下载器"; 
   this.ResumeLayout(false); 
   } 
   #endregion 
   
   ///  
   /// 应用程序的主入口点。 
   /// 
 
   [STAThread] 
   static void Main() 
   { 
   Application.Run(new Form1()); 
   } 
   
   private string DoSocketGet(string server) 
   { 
   //定义一些必要的变量以及一条要发送到服务器的字符串 
   Encoding ASCII = Encoding.ASCII; 
   string Get = "GET / HTTP/1.1\r\nHost: " 
   +server+"\r\nConnection: Close\r\n\r\n"; 
   Byte[] ByteGet = ASCII.GetBytes(Get); 
   Byte[] RecvBytes = new Byte[256]; 
   String strRetPage = null; 
   
   //获取服务器相关的IP地址列表,其中第一项即为我们所需的 
   IPAddress hostadd = Dns.Resolve(server). 
   AddressList[0]; 
   
   //根据获得的服务器的IP地址创建一个终结点,端口为默认的80 
   IPEndPoint EPhost = new IPEndPoint 
   (hostadd, 80); 
   
   //创建一个Socket实例 
   Socket s = new Socket(AddressFamily. 
   InterNetwork, SocketType.Stream, 
   ProtocolType.Tcp ); 
   try 
   { 
   //用上面所取得的终结点连接到服务器 
   s.Connect(EPhost); 
   } 
   catch(Exception se) 
   { 
   MessageBox.Show("连接错误:"+se. 
   Message,"提示信息",MessageBoxButtons. 
   RetryCancel,MessageBoxIcon.Information); 
   } 
   
   if (!s.Connected) 
   { 
   strRetPage = "不能连接到服务器!"; 
   return strRetPage; 
   } 
   
   try 
   { 
   //向服务器发送GET命令 
   s.Send(ByteGet, ByteGet.Length, 
   SocketFlags.None); 
   } 
   catch(Exception ce) 
   { 
   MessageBox.Show("发送错误:"+ce. 
   Message,"提示信息",MessageBoxButtons. 
   RetryCancel,MessageBoxIcon.Information); 
   } 
   
   //接收页面数据,直到所有字节接收完毕 
   Int32 bytes = s.Receive(RecvBytes, 
   RecvBytes.Length, 0); 
   strRetPage = "以下是在服务器" + server + 
   "上的默认网页:\r\n"; 
   strRetPage = strRetPage + ASCII.GetString 
   (RecvBytes, 0, bytes); 
   
   while (bytes > 0) 
   { 
   bytes = s.Receive(RecvBytes, 
   RecvBytes.Length, SocketFlags.None); 
   strRetPage = strRetPage + ASCII. 
   GetString(RecvBytes, 0, bytes); 
   } 
   
   //禁用并关闭Socket实例 
   s.Shutdown(SocketShutdown.Both); 
   s.Close(); 
   return strRetPage; 
   } 
   
   private void Download_Click(object sender, System. 
   EventArgs e) 
   { 
   //将所读取的字符串转换为字节数组 
   byte[] content=Encoding.ASCII.GetBytes 
   (DoSocketGet(ServerAddress.Text)); 
   try 
   { 
   //创建文件流对象实例 
   FileStream fs=new FileStream 
   (Filename.Text,FileMode.OpenOrCreate,FileAccess. 
   ReadWrite); 
   //写入文件 
   fs.Write(content,0,content.Length); 
   } 
   catch(Exception fe) 
   { 
   MessageBox.Show("文件创建/写入错误: 
   "+fe.Message,"提示信息",MessageBoxButtons. 
   RetryCancel,MessageBoxIcon.Information); 
   } 
   } 
   } 
  } 
   
   
   
  其中主要的函数为DoSocketGet(),首先程序在响应"开始下载"的事件处理函数Download_Click(),调用DoSocketGet()函数,该函数完成了套接字的创建、连接、与主机的通讯-即获得主机上的网页、禁用、关闭等功能。在调用完DoSocketGet()函数后,Download_Click()函数创建一个FileStream对象,并试图将DoSocketGet()函数返回的网页文件以字节数组的形式写到本机文件中,最终形成在本机上的一个Html文件,这样就完成了一个网页文件的下载工作了。 
   
    不过这个程序的功能比较简单,不能作为真正的网页浏览器用,网页文件下载后还是要用IE等浏览器才能打开。然而作为一个解释.NET底层网络编程的实例绝对是一个好例子,所以希望读者能好好研究,同时读者还可以添加文件下载进度条等以完善本程序。 
   
    注:以上程序在Windows 2000服务器版、Visual Studio.Net中文正式版下调试通过 

  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:构造.NET环境下的网页下载器 (1)
· 下一篇:ASP.NET编程中的十大技巧(上)
· 用JSP构建动态网站
· ASP.Net中的时间处理
· 结合singleton和线程做一个定时服务
· 且看微软的.Net和Sun公司的J2EE如何对垒
· ASP.NET发送ICQ消息DIY


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077