最后,我就综合以上C#网络编程的一些知识,向大家展示一个很好的实例。该实例是一个运用Socket的基于同步模式的客户端应用程序,它首先通过解析服务器的IP地址建立一个终结点,同时创建一个基于流套接字的Socket连接,其运用的协议是TCP协议。通过该Socket就可以发送获取网页的命令,再通过该Socket获得服务器上默认的网页,最后通过文件流将获得的数据写入本机文件。这样就完成了网页的下载工作了,程序运行的效果如下所示:



源代码如下:(其中主要的函数为DoSocketGet()
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(1624);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(8023);

this.label1.TabIndex = 0;

this.label1.Text = "服务器地址:";

this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;

// 

// label2

// 

this.label2.Location = new System.Drawing.Point(1664);

this.label2.Name = "label2";

this.label2.Size = new System.Drawing.Size(8023);

this.label2.TabIndex = 1;

this.label2.Text = "本地文件名:";

this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;

// 

// Download

// 

this.Download.Location = new System.Drawing.Point(28824);

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(9624);

this.ServerAddress.Name = "ServerAddress";

this.ServerAddress.Size = new System.Drawing.Size(17621);

this.ServerAddress.TabIndex = 3;

this.ServerAddress.Text = "";

// 

// Filename

// 

this.Filename.Location = new System.Drawing.Point(9664);

this.Filename.Name = "Filename";

this.Filename.Size = new System.Drawing.Size(17621);

this.Filename.TabIndex = 4;

this.Filename.Text = "";

// 

// Form1

// 

this.AutoScaleBaseSize = new System.Drawing.Size(614);

this.ClientSize = new System.Drawing.Size(376117);

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);

}

}

}

}



以上程序在Windows 2000服务器版、Visual Studio.Net中文正式版下调试通过
posted on 2011-04-15 10:52  钱途无梁  阅读(364)  评论(0编辑  收藏  举报