如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
C#Socket编程2010年07月28日星期三08:59续实例解析SOCKET编程模型之异步通信篇(上).NET框架的Socket类实际上是Winsock32API提供的套接字服务的托管代码版本。其中Socket类为网络通信提供了一套丰富的方法和属性,大多数情况下,Socket类方法只是将数据封送到它们的本机Win32副本中并处理任何必要的安全检查。Socket类允许使用ProtocolType枚举中所列出的任何一种协议执行异步和同步数据传输。Socket类遵循异步方法的.NETFramework命名模式;例如,同步Receive方法对应于异步BeginReceive和EndReceive方法。事实上Socket可以象流Stream一样被视为一个应用程序端(客户端)和远程服务器端之间数据通道,通过这个通道来对数据进行读取(接收)和写入(发送)。异步模式所提供的革新之一就是调用方确定特定调用是否应是异步的。对于被调用的对象,没有必要执行附加的编程来用于支持其客户端的异步行为;在该模式中异步委托提供此功能。如果应用程序在执行期间只需要一个线程,请使用我在《实例解析SOCKET编程模型》中介绍的方法,这些方法适用于单线程同步操作模式。同步操作模式对执行网络操作的函数(如Send和Receive)的调用一直等到操作完成后才将控制返回给调用程序。若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。异步操作模式对执行网络操作的函数的调用立即返回。如果当前使用的是面向连接的协议(如TCP),则可使用Socket、BeginConnect和EndConnect方法来连接侦听主机。通过使用BeginSend和EndSend方法,或者使用BeginReceive和EndReceive方法,可以进行异步数据通信。可以使用BeginAccept和EndAccept处理传入的连接请求。如果当前使用的是无连接协议(如UDP),则可以使用BeginSendTo和EndSendTo来发送数据报,而使用BeginReceiveFrom和EndReceiveFrom来接收数据报。当数据发送和数据接收完成之后,可使用Shutdown方法来禁用Socket。在调用Shutdown之后,可调用Close方法来释放与Socket关联的所有资源。Socket类允许使用SetSocketOption方法来配置Socket。可使用GetSocketOption方法来检索这些设置。注意如果编写较简单的应用程序,而且只需同步数据传输,则可以考虑使用TcpClient、TcpListener和UdpClient。这些类为Socket通信提供了更简单、对用户更友好的接口。从TCP/IP模型上来看,像System.Net命名空间中的HttpWebReqeust类和HttpWebResponse类属于请求/响应层。TcpClient、TcpListener和UdpClient这些类属于应用协议层,处中间。而Socket类处于传输层,是最底层。当其上面的请求/响应层和应用协议层不能满足应用程序的特殊需要时,就需要使用传输层进行Socket套接字编程。异步服务器套接字使用.NETFramework异步编程模型处理网络服务请求。Socket类遵循标准.NETFramework异步命名模式;例如,同步Accept方法对应异步BeginAccept和EndAccept方法。异步服务器套接字需要一个开始接受网络连接请求的方法,一个处理连接请求并开始接收网络数据的回调方法以及一个结束接收数据的回调方法。本节将进一步讨论所有这些方法。在下面的源码中,为开始接受网络连接请求,方法StartListening初始化Socket,然后使用BeginAccept方法开始接受新连接。当套接字上接收到新连接请求时,将调用接受回调方法。它负责获取将处理连接的Socket实例,并将Socket提交给将处理请求的线程。接受回调方法实现AsyncCallback委托;它返回void,并带一个IAsyncResult类型的参数。下面的示例是接受回调方法的外壳程序:privatevoidAcceptCallBack(IAsyncResultar){}BeginAccept方法带两个参数:指向接受回调方法的AsyncCallback委托和一个用于将状态信息传递给回调方法的对象。在下面的示例中,侦听Socket通过状态参数传递给回调方法。本示例创建一个AsyncCallback开始一个异步操作来接受一个传入的连接尝试listeningSocket.BeginAccept(newAsyncCallback(AcceptCallBack