C#.Net网络Socket程序开发

Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
 
  抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。可以如下示意:

可见,传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
 
  而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。
 
  其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。

可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据;
 
  针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。
 
  在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:
 
  public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
 
 
  其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。
 
  下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。
 
  Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
 
  若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:
 
  Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
 
 
  一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有:
 
  Socket.Connect方法:建立到远程设备的连接
  public void Connect(EndPoint remoteEP)(有重载方法)
  Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。
  public int Send(byte[], int, SocketFlags);(有重载方法)
  Socket.SendTo 方法 将数据发送到特定终结点。
  public int SendTo(byte[], EndPoint);(有重载方法)
  Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。
  public int Receive(byte[],int,SocketFlags);
  Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。
  public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);
  Socket.Bind 方法:使 Socket 与一个本地终结点相关联:
  public void Bind( EndPoint localEP );
  Socket.Listen方法:将 Socket 置于侦听状态。
  public void Listen( int backlog );
  Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。
  public Socket Accept();
  Socket.Shutdown方法:禁用某 Socket 上的发送和接收
  public void Shutdown( SocketShutdown how );
  Socket.Close方法:强制 Socket 连接关闭
  public void Close();
 
 
  可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。
 
  用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例:
 
  IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:
 
  IPAddress myIP = IPAddress.Parse("192.168.1.2");
 
 
  Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。
 
  IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
  IPAddress ipAddress = ipHostInfo.AddressList[0];
 
 
  你也可以使用GetHostName方法得到IPHostEntry实例:
 
  IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")
 
 
  在使用以上方法时,你将可能需要处理以下几种异常:
 
  SocketException异常:访问Socket时操作系统发生错误引发
 
  ArgumentNullException异常:参数为空引用引发
 
  ObjectDisposedException异常:Socket已经关闭引发

时间: 2024-10-02 06:12:02

C#.Net网络Socket程序开发的相关文章

C#.Net网络程序开发-Socket篇

程序|网络 Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断

Visual C#.Net 网络程序开发-Socket篇第1/2页_C#教程

Visual C#.Net 网络程序开发-Socket篇   作者: 宋华  作者: www.ASPCool.com  Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需

C#.Net网络程序开发-Tcp篇

程序|网络 前一篇<Visual C#.Net网络程序开发-Socket篇>中说到:支持Http.Tcp和Udp的类组成了TCP/IP三层模型(请求响应层.应用协议层.传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP 套接字的创建,不需要处理连接的细节,这使得我们在编写套接字级别的协议时,可以更多地尝试使用 TCPClient . UDPClient和TcpListener,而不是直接向 Socket 中写.它们之间的这种层次

Visual C#.Net网络程序开发-Tcp篇(2) 祥细内容:

前面我们说,TcpClient类创建在Socket之上,在Tcp服务方面提供了更高层次的抽象,体现在网络数据的发送和接受方面,是TcpClient使用标准的Stream流处理技术,使得它读写数据更加方便直观,同时,.Net框架负责提供更丰富的结构来处理流,贯穿于整个.Net框架中的流具有更广泛的兼容性,构建在更一般化的流操作上的通用方法使我们不再需要困惑于文件的实际内容(HTML.XML 或其他任何内容),应用程序都将使用一致的方法(Stream.Write.Stream.Read) 发送和接收

Visual C#.Net网络程序开发-Tcp篇(1) 祥细内容:

前一篇<Visual C#.Net网络程序开发-Socket篇>中说到:支持Http.Tcp和Udp的类组成了TCP/IP三层模型(请求响应层.应用协议层.传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP 套接字的创建,不需要处理连接的细节,这使得我们在编写套接字级别的协议时,可以更多地尝试使用 TCPClient . UDPClient和TcpListener,而不是直接向 Socket 中写.它们之间的这种层次关系示意如下

043_《Delphi程序开发范例宝典(第2版)》

<Delphi程序开发范例宝典(第2版)> Delphi 教程 系列书籍 (043) <Delphi程序开发范例宝典(第2版)> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 作者: 梁水 丛书名: 软件工程师典藏 出版社:人民邮电出版社 ISBN:9787115216762 上架时间:2010-1-8 出版日期:2010 年1月 开本:16开 页码:770 版次:2-1 内容简介 本书全面介绍了delphi程序开发所

《深入解析IPv6(第3版)》——2.4 应用程序开发接口

2.4 应用程序开发接口 Windows包含以下支持IPv6的应用程序接口(API). Windows Sockets(Windows套接字). Winsock Kernel. Remote Procedure Call(远程过程调用). Internet Protocol Helper. Win32 Internet Extensions(Win32 Internet扩展). NET Framework(.NET框架). Windows Runtime. Windows Filtering P

程序开发-请教关于asp.net的问题

问题描述 请教关于asp.net的问题 asp.net做的是前端(就是像htmlcssjavascript那样的)还是做的是后端(像java的web程序开发,像jspservelet三大框架那样的)? 还有就是,对应于java的web程序开发,.net的wen程序开发要使用到那些技术?asp.met是不是?还有wcfwf那些又是些什么? 自己查资料,太文绉绉,看不太明白,求大神解释一下 解决方案 asp.net毫无疑问是后端的技术.wcf是用来做网络通讯和远程调用的框架,wf是工作流框架. 解决

Linux 应用程序开发入门

Linux 应用程序开发入门 Neo Chen (netkiller) <openunix@163.com> 版权 2011, 2012 http://netkiller.github.com 摘要 我会实现一个守护进程,从这个程序你将了解,Linux 应用程序开发基本流程 我们将实现一个远程shell的功能,可以通过tcp协议,运行远程机器上的命令或shell脚本 通过这个命令可以实现批量操作,管理上千台服务器.需要发挥你的想象力,灵活使用它. 写这个脚本,我是为了替代SSH远程操作,因为S