1、C#网络编程概述本站整理 网络搜集 2008-02-06 点击: 352 字体:大 中 小 我要评论 编程|网络C#网络编程概述微软下一代互联网开发工具 VS.Net 已于三月份在全国范围推出,其中的一门新兴语言 C#正被越来越多的开发者所接受并运用。C#作为一门集众家之长的语言,在各个方面尤其是网络编程方面有着很大的优势。本文就向大家介绍一下用 C#进行网络编程的一些基本知识和方法。微软的.Net 框架为我们进行网络编程提供了以下两个名字空间:System.Net 以及 System.Net.Sockets。通过合理运用其中的类和方法,我们可以很容易地编写出各种网络应用程序。这种网络应用程序
2、既可以是基于流套接字的,也可以是基于数据报套接字的。而基于流套接字的通讯中采用最广泛的协议就是 TCP 协议,基于数据报套接字的通讯中采用最广泛的自然就是 UDP 协议了。下面我重点向大家介绍 C#网络编程中的一些类:Dns 类、IPHostEntry 类、IPEndPoint 类以及 Socket 类,最后我会给出相应的实例以加深读者的理解。 Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其 Resolve()方法查询 DNS 服务器以将用户友好的域名(如““)映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve()方法返回
3、一个IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。Resolve()方法的函数原型如下:public static IPHostEntry Resolve(string hostName);下面的代码获取一个 IPAddress 实例,该实例包含服务器 的 IP 地址:IPHostEntry ipHostInfo = Dns.Resolve(““);IPAddress ipAddress = ipHostInfo.AddressList0;不过在 Dns 类中,除了通过 Resolve()方法,你还
4、可以通过GetHostByAddress()方法以及 GetHostByName()方法来得到相应的IPHostEntry 实例,函数原型如下:public static IPHostEntry GetHostByAddress(string IPAddress);public static IPHostEntry GetHostByName(string hostName);下面的代码显示了如何分别运用以上两种方法获得包含服务器 的相关信息的 IPHostEntry 实例:IPHostEntry hostInfo=Dns.GetHostByAddress(“192.168.1.1”);IPH
5、ostEntry hostInfo=Dns.GetHostByName(““);在使用以上方法时,你将可能需要处理以下几种异常:SocketException 异常:访问 Socket 时操作系统发生错误引发 ArgumentNullException 异常:参数为空引用引发 ObjectDisposedException 异常:Socket 已经关闭引发以上,我向大家简要地介绍了 Dns 类中一些方法以及其用法,并列举出了可能出现的异常,下面就让我们转到和 Dns 类密切相关的 IPHostEntry 类。 IPHostEntry 类:该类的实例对象中包含了 Internet 主机的地址相关
6、信息。此类型的所有公共静态成员对多线程操作而言都是安全的,但不保证任何实例成员是线程安全的。其中主要的一些属性有:AddressList 属性、Aliases 属性以及 HostName 属性。AddressList 属性和 Aliases 属性的作用分别是获取或设置与主机关联的 IP 地址列表以及获取或设置与主机关联的别名列表。其中 AddressList 属性值是一个 IPAddress 类型的数组,包含解析为 Aliases 属性中包含的主机名的 IP 地址;Aliases 属性值是一组字符串,包含解析为 AddressList 属性中的 IP 地址的DNS 名。而 HostName 属
7、性比较好理解,它包含了服务器的主要主机名,这光从名称上就可以知道了。如果服务器的 DNS 项定义了附加别名,则可在 Aliases属性中使用这些别名。下面的代码列出了服务器 的相关别名列表以及 IP 地址列表的长度并将所有的 IP 地址列出:IPHostEntry IPHost = Dns.Resolve(“ aliases = IPHost.Aliases;Console.WriteLine(aliases.Length);IPAddress addr = IPHost.AddressList;Console.WriteLine(addr.Length);for(int i= 0; i 0
8、)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=Enc
9、oding.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);