構造.NET環境下的網頁下載器 (2)

來源:互聯網
上載者:User
網頁|下載 三.網頁下載器執行個體介紹:

  最後,我就綜合以上.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
{
/// <summary>
/// Form1 的摘要說明。
/// </summary>

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;
/// <summary>
/// 必需的設計器變數。
/// </summary>
private System.ComponentModel.Container
components = null;
public Form1()
{
//
// Windows 表單設計器支援所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent
// 調用後添加任何建構函式代碼
}

/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// 設計器支援所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
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

/// <summary>
/// 應用程式的主進入點。
/// </summary>
[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中文正式版下調試通過。

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。