C#网络编程概述.docx
- 文档编号:10031807
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:22.11KB
C#网络编程概述.docx
《C#网络编程概述.docx》由会员分享,可在线阅读,更多相关《C#网络编程概述.docx(16页珍藏版)》请在冰点文库上搜索。
C#网络编程概述
推荐0
C#网络编程概述
(1)
微软下一代互联网开发工具VS.Net已于三月份在全国范围推出,其中的一门新兴语言C#正被越来越多的开发者所接受并运用。
C#作为一门集众家之长的语言,在各个方面尤其是网络编程方面有着很大的优势。
本文就向大家介绍一下用C#进行网络编程的一些基本知识和方法。
微软的.Net框架为我们进行网络编程提供了以下两个名字空间:
System.Net以及System.Net.Sockets。
通过合理运用其中的类和方法,我们可以很容易地编写出各种网络应用程序。
这种网络应用程序既可以是基于流套接字的,也可以是基于数据报套接字的。
而基于流套接字的通讯中采用最广泛的协议就是TCP协议,基于数据报套接字的通讯中采用最广泛的自然就是UDP协议了。
下面我重点向大家介绍C#网络编程中的一些类:
Dns类、IPHostEntry类、IPEndPoint类以及Socket类,最后我会给出相应的实例以加深读者的理解。
Dns类:
向使用TCP/IPInternet服务的应用程序提供域名服务。
其Resolve()方法查询DNS服务器以将用户友好的域名(如"")映射到数字形式的Internet地址(如192.168.1.1)。
Resolve()方法返回一个IPHostEnty实例,该实例包含所请求名称的地址和别名的列表。
大多数情况下,可以使用AddressList数组中返回的第一个地址。
Resolve()方法的函数原型如下:
publicstaticIPHostEntryResolve(stringhostName);
下面的代码获取一个IPAddress实例,该实例包含服务器的IP地址:
IPHostEntryipHostInfo=Dns.Resolve("");
IPAddressipAddress=ipHostInfo.AddressList[0];
不过在Dns类中,除了通过Resolve()方法,你还可以通过GetHostByAddress()方法以及GetHostByName()方法来得到相应的IPHostEntry实例,函数原型如下:
publicstaticIPHostEntryGetHostByAddress(stringIPAddress);
publicstaticIPHostEntryGetHostByName(stringhostName);
下面的代码显示了如何分别运用以上两种方法获得包含服务器的相关信息的IPHostEntry实例:
IPHostEntryhostInfo=Dns.GetHostByAddress(“192.168.1.1”);
IPHostEntryhostInfo=Dns.GetHostByName("");
在使用以上方法时,你将可能需要处理以下几种异常:
SocketException异常:
访问Socket时操作系统发生错误引发
ArgumentNullException异常:
参数为空引用引发
ObjectDisposedException异常:
Socket已经关闭引发
以上,我向大家简要地介绍了Dns类中一些方法以及其用法,并列举出了可能出现的异常,下面就让我们转到和Dns类密切相关的IPHostEntry类.
IPHostEntry类:
该类的实例对象中包含了Internet主机的地址相关信息。
此类型的所有公共静态成员对多线程操作而言都是安全的,但不保证任何实例成员是线程安全的。
其中主要的一些属性有:
AddressList属性、Aliases属性以及HostName属性。
AddressList属性和Aliases属性的作用分别是获取或设置与主机关联的IP地址列表以及获取或设置与主机关联的别名列表。
其中AddressList属性值是一个IPAddress类型的数组,包含解析为Aliases属性中包含的主机名的IP地址;Aliases属性值是一组字符串,包含解析为AddressList属性中的IP地址的DNS名。
而HostName属性比较好理解,它包含了服务器的主要主机名,这光从名称上就可以知道了。
如果服务器的DNS项定义了附加别名,则可在Aliases属性中使用这些别名。
下面的代码列出了服务器的相关别名列表以及IP地址列表的长度并将所有的IP地址列出:
IPHostEntryIPHost=Dns.Resolve("
string[]aliases=IPHost.Aliases;
Console.WriteLine(aliases.Length);
IPAddress[]addr=IPHost.AddressList;
Console.WriteLine(addr.Length);
for(inti=0;i { Console.WriteLine(addr[i]); } 介绍完IPHostEntry类,我们能获得了所要连接的主机的相关IP地址以及别名列表,但是真正要和主机取得连接还需要一个很重要的类-IPEndPoint类。 (文章摘自pconline) C#网络编程概述 (2) 在Internet中,TCP/IP使用一个网络地址和一个服务端口号来唯一标识设备。 网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。 网络地址和服务端口的组合称为终结点,在.NET框架中正是由EndPoint类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。 .Net同时也为每个受支持的地址族定义了EndPoint的子代;对于IP地址族,该类为IPEndPoint。 IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。 在IPEndPoint类中有两个很有用的构造函数: publicIPEndPoint(long,int); publicIPEndPoint(IPAddress,int); 它们的作用就是用指定的地址和端口号初始化IPEndPoint类的新实例。 该类中的属性有: Address属性、AddressFamily属性以及Port属性,这些属性相对比较容易理解,这里就不作多介绍。 下面的代码显示了如何取得服务器的终结点: IPHostEntryIPHost=Dns.Resolve(""); IPAddress[]addr=IPHost.AddressList; IPEndPointep=newIPEndPoint(addr[0],80); 这样,我们已经了解了和主机取得连接的一些必要的基本类,有了这些知识,我们就可以运用下面的Socket类真正地和主机取得连接并进行通讯了。 Socket类: Socket类是包含在System.Net.Sockets名字空间中的一个非常重要的类。 一个Socket实例包含了一个本地以及一个远程的终结点,就像上面介绍的那样,该终结点包含了该Socket实例的一些相关信息。 需要知道的是Socket类支持两种基本模式: 同步和异步。 其区别在于: 在同步模式中,对执行网络操作的函数(如Send和Receive)的调用一直等到操作完成后才将控制返回给调用程序。 在异步模式中,这些调用立即返回。 下面我们重点讨论同步模式的Socket编程。 首先,同步模式的Socket编程的基本过程如下: 1.创建一个Socket实例对象。 2.将上述实例对象连接到一个具体的终结点(EndPoint)。 3.连接完毕,就可以和服务器进行通讯: 接收并发送信息。 4.通讯完毕,用ShutDown()方法来禁用Socket。 5.最后用Close()方法来关闭Socket。 知道了以上基本过程,我们就开始进一步实现连接并通讯了。 在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现: publicSocket(AddressFamilyaddressFamily,SocketTypesocketType,ProtocolTypeprotocolType); 其中,addressFamily参数指定Socket使用的寻址方案,比如AddressFamily.InterNetwork表明为IP版本4的地址;socketType参数指定Socket的类型,比如SocketType.Stream表明连接是基于流套接字的,而SocketType.Dgram表示连接是基于数据报套接字的。 protocolType参数指定Socket使用的协议,比如ProtocolType.Tcp表明连接协议是运用TCP协议的,而Protocol.Udp则表明连接协议是运用UDP协议的。 (摘自PCONLINE) C#网络编程连载(三) 橙子发表于2005-4-2820: 02: 00 C#网络编程概述(3) 在创建了Socket实例后,我们就可以通过一个远程主机的终结点和它取得连接,运用的方法就是Connect()方法: publicConnect(EndPointep); 该方法只可以被运用在客户端。 进行连接后,我们可以运用套接字的Connected属性来验证连接是否成功。 如果返回的值为true,则表示连接成功,否则就是失败。 下面的代码就显示了如何创建Socket实例并通过终结点与之取得连接的过程: IPHostEntryIPHost=Dns.Resolve(" string[]aliases=IPHost.Aliases; IPAddress[]addr=IPHost.AddressList; EndPointep=newIPEndPoint(addr[0],80); Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); sock.Connect(ep); if(sock.Connected) Console.WriteLine("OK"); 一旦连接成功,我们就可以运用Send()和Receive()方法来进行通讯。 Send()方法的函数原型如下: publicintSend(byte[]buffer,intsize,SocketFlagsflags); 其中,参数buffer包含了要发送的数据,参数size表示要发送数据的大小,而参数flags则可以是以下一些值: SocketFlags.None、SocketFlags.DontRoute、SocketFlags.OutOfBnd。 该方法返回的是一个System.Int32类型的值,它表明了已发送数据的大小。 同时,该方法还有以下几种已被重载了的函数实现: publicintSend(byte[]buffer); publicintSend(byte[]buffer,SocketFlagsflags); publicintSend(byte[]buffer,intoffset,intsize,SocketFlagsflags); 介绍完Send()方法,下面是Receive()方法,其函数原型如下: publicintReceive(byte[]buffer,intsize,SocketFlagsflags); 其中的参数和Send()方法的参数类似,在这里就不再赘述。 同样,该方法还有以下一些已被重载了的函数实现: publicintReceive(byte[]buffer); publicintReceive(byte[]buffer,SocketFlagsflags); publicintReceive(byte[]buffer,intoffset,intsize,SocketFlagsflags); (摘自PCONLINE) C#网络编程概述(4) 在通讯完成后,我们就通过ShutDown()方法来禁用Socket,函数原型如下: publicvoidShutDown(SocketShutdownhow); 其中的参数how表明了禁用的类型,SoketShutdown.Send表明关闭用于发送的套接字;SoketShutdown.Receive表明关闭用于接收的套接字;而SoketShutdown.Both则表明发送和接收的套接字同时被关闭。 应该注意的是在调用Close()方法以前必须调用ShutDown()方法以确保在Socket关闭之前已发送或接收所有挂起的数据。 一旦ShutDown()调用完毕,就调用Close()方法来关闭Socket,其函数原型如下: publicvoidClose(); 该方法强制关闭一个Socket连接并释放所有托管资源和非托管资源。 该方法在内部其实是调用了方法Dispose(),该函数是受保护类型的,其函数原型如下: protectedvirtualvoidDispose(booldisposing); 其中,参数disposing为true或是false,如果为true,则同时释放托管资源和非托管资源;如果为false,则仅释放非托管资源。 因为Close()方法调用Dispose()方法时的参数是true,所以它释放了所有托管资源和非托管资源。 这样,一个Socket从创建到连接到通讯最后的关闭的过程就完成了。 虽然整个过程比较复杂,但相对以前在SDK或是其他环境下进行Socket编程,这个过程就显得相当轻松了。 (摘自PCONLINE C#网络编程连载(五) 橙子发表于2005-4-2820: 22: 00 最后,我就综合以上C#网络编程的一些知识,向大家展示一个很好的实例。 该实例是一个运用Socket的基于同步模式的客户端应用程序,它首先通过解析服务器的IP地址建立一个终结点,同时创建一个基于流套接字的Socket连接,其运用的协议是TCP协议。 通过该Socket就可以发送获取网页的命令,再通过该Socket获得服务器上默认的网页,最后通过文件流将获得的数据写入本机文件。 这样就完成了网页的下载工作了,程序运行的效果如下所示: 源代码如下: (其中主要的函数为DoSocketGet()) usingSystem; usingSystem.Drawing; usingSystem.Collections; usingSystem.ComponentModel; usingSystem.Windows.Forms; usingSystem.Data; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; usingSystem.IO; namespaceSocketSample { /// ///Form1的摘要说明。 /// publicclassForm1: System.Windows.Forms.Form { privateSystem.Windows.Forms.Labellabel1; privateSystem.Windows.Forms.Labellabel2; privateSystem.Windows.Forms.ButtonDownload; privateSystem.Windows.Forms.TextBoxServerAddress; privateSystem.Windows.Forms.TextBoxFilename; /// ///必需的设计器变量。 /// privateSystem.ComponentModel.Containercomponents=null; publicForm1() { // //Windows窗体设计器支持所必需的 // InitializeComponent(); // //TODO: 在InitializeComponent调用后添加任何构造函数代码 // } /// ///清理所有正在使用的资源。 /// protectedoverridevoidDispose(booldisposing) { if(disposing) { if(components! =null) { components.Dispose(); } } base.Dispose(disposing); } #regionWindowsFormDesignergeneratedcode /// ///设计器支持所需的方法-不要使用代码编辑器修改 ///此方法的内容。 /// privatevoidInitializeComponent() { this.label1=newSystem.Windows.Forms.Label(); this.label2=newSystem.Windows.Forms.Label(); this.Download=newSystem.Windows.Forms.Button(); this.ServerAddress=newSystem.Windows.Forms.TextBox(); this.Filename=newSystem.Windows.Forms.TextBox(); this.SuspendLayout(); // //label1 // this.label1.Location=newSystem.Drawing.Point(16,24); this.label1.Name="label1"; this.label1.Size=newSystem.Drawing.Size(80,23); this.label1.TabIndex=0; this.label1.Text="服务器地址: "; this.label1.TextAlign=System.Drawing.ContentAlignment.MiddleRight; // //label2 // this.label2.Location=newSystem.Drawing.Point(16,64); this.label2.Name="label2"; this.label2.Size=newSystem.Drawing.Size(80,23); this.label2.TabIndex=1; this.label2.Text="本地文件名: "; this.label2.TextAlign=System.Drawing.ContentAlignment.MiddleRight; // //Download // this.Download.Location=newSystem.Drawing.Point(288,24); this.Download.Name="Download"; this.Download.TabIndex=2; this.Download.Text="开始下载"; this.Download.Click+=newSystem.EventHandler(this.Download_Click); // //ServerAddress // this.ServerAddress.Location=newSystem.Drawing.Point(96,24); this.ServerAddress.Name="ServerAddress"; this.ServerAddress.Size=newSystem.Drawing.Size(176,21); this.ServerAddress.TabIndex=3; this.ServerAddress.Text=""; // //Filename // this.Filename.Location=newSystem.Drawing.Point(96,64); this.Filename.Name="Filename"; this.Filename.Size=newSystem.Drawing.Size(176,21); this.Filename.TabIndex=4; this.Filename.Text=""; // //Form1 // this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14); this.ClientSize=newSystem.Drawing.Size(376,117); this.Controls.AddRange(newSystem.Windows.Forms.Control[]{ this.Filename, this.ServerAddress, this.Download, this.label2, this.label1}); this.Name="Form1"; this.Text="网页下载器"; this.ResumeLayout(false); } #endregion /// ///应用程序的主入口点。 /// [STAThread] staticvoidMain() { Application.Run(newForm1()); } privatestringDoSocketGet(stringserver) { /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 网络 编程 概述