C#网络编程概述 三

简介: Code转自 http://www.cnblogs.com/xh831213/archive/2006/02/13/329639.html最后,我就综合以上C#网络编程的一些知识,向大家展示一个很好的实例。
img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
转自 http://www.cnblogs.com/xh831213/archive/2006/02/13/329639.html


最后,我就综合以上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中文正式版下调试通过
目录
相关文章
|
3月前
|
网络协议 网络安全 网络性能优化
【计算机网络概述】第一章:概论 1.2什么是网络边缘
【计算机网络概述】第一章:概论 1.2什么是网络边缘
|
4月前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
57 3
|
29天前
|
存储 网络协议 安全
|
1月前
|
数据采集 移动开发 Python
六:《智慧的网络爬虫》— 正则表达式概述
【8月更文挑战第7天】本文介绍了正则表达式的基本概念、用途,如表单验证和爬虫,以及Python中re模块的使用,包括match(),match()函数、元字符、预定义字符集、重复匹配、位置匹配、非贪婪模式和re模块的常用方法如compile(),search(),findall(),split(),sub()等。
53 1
六:《智慧的网络爬虫》— 正则表达式概述
|
8天前
|
Linux 调度 Docker
容器网络概述
【9月更文挑战第9天】容器技术利用如命名空间(namespace)和控制组(cgroup)等技术创建隔离环境,实现资源限制与独立运行。命名空间避免命名冲突,cgroup则能对CPU、内存等资源进行限制。容器状态可通过镜像保存并标准化,确保在任何环境中都能复现相同状态。
|
1月前
|
存储 NoSQL MongoDB
八:《智慧的网络爬虫》— MongoDB概述
【8月更文挑战第14天】本篇文章简单介绍了MongoDB的下载和安装以;其基本的操作语法,并附上每个语法的代码示例,为后续的爬虫学习打下基础
28 0
八:《智慧的网络爬虫》— MongoDB概述
|
1月前
|
SQL 数据采集 关系型数据库
七:《智慧的网络爬虫》— MySQL概述
【8月更文挑战第11天】本篇文章详细的介绍了MySQL数据库的安装与使用;并讲述了MySQL的基本操作及其应用语法
34 0
七:《智慧的网络爬虫》— MySQL概述
|
16天前
|
存储 运维 监控
|
1月前
|
Linux 调度 Docker
容器网络概述
【8月更文挑战第7天】容器就是 Container,而 Container 的另一个意思是集装箱。其实容器的思想就是要变成软件交付的集装箱。集装箱的特点,一是打包,二是标准。
|
3月前
|
数据采集 前端开发 开发者
《智慧的网络爬虫》— CSS概述
CSS主要作用是定义网页的样式。如网页元素的位置、大小、颜色等,也是前端及爬虫入门必须要学习的内容
39 7
《智慧的网络爬虫》—  CSS概述