异步TCP---简单聊天例子
异步TCP和同步TCP类似,和其他所有的异步调用一样:
几个基本的异步调用.
AsyncCallback委托
AsyncCallback委托用于引用异步操作完成时调用的回调方法。在异步操作方式下,由于程序可以在启动异步操作后继续执行其他代码,因此必须有一种机制,以保证该异步操作完成时能及时通知调用者。这种机制可以通过AsyncCallback委托实现。
异步操作的每一个方法都有一个Begin…方法和End…方法,例如BeginAcceptTcpClient和EndAcceptTcpClient。程序调用Begin…方法时,系统会自动在线程池中创建对应的线程进行异步操作,从而保证调用方和被调用方同时执行,当线程池中的Begin…方法执行完毕时,会自动通过AsyncCallback委托调用在Begin…方法的参数中指定的回调方法。
回调方法是在程序中事先定义的,在回调方法中,通过End…方法获取Begin…方法的返回值和所有输入/输出参数,从而达到异步操作方式下完成参数传递的目的。
BeginAcceptTcpClient方法和EndAcceptTcpClient方法
BeginAcceptTcpClient和EndAcceptTcpClient方法包含在System.Net.Sockets命名空间下的TcpListener类中。在异步TCP应用编程中,服务器端可以使用TcpListener类提供的BeginAcceptTcpClient方法开始接收新的客户端连接请求。在这个方法中,系统自动利用线程池创建需要的线程,并在操作完成时利用异步回调机制调用提供给它的方法,同时返回相应的状态参数,其方法原型为:
public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, Object state)
其中:参数1为AsyncCallback类型的委托;参数2为Object类型,用于将状态信息传递给委托提供的方法。例如:
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
tcpListener.BeginAcceptTcpClient(callback, tcpListener);
程序执行BeginAcceptTcpClient方法后,即在线程池中自动创建需要的线程,同时在自动创建的线程中监听客户端连接请求。一旦接受了客户连接请求,就自动通过委托调用提供给委托的方法,并返回状态信息。这里我们给委托自动调用的方法命名为AcceptTcpClientCallback,状态信息定义为TcpListener类型的实例tcpListener。在程序中,定义该方法的格式为:
void AcceptTcpClientCallback( IAsyncResult ar)
{
回调代码
}
方法中传递的参数只有一个,而且必须是IAsyncResult类型的接口,它表示异步操作的状态。由于我们定义了委托提供的方法(即AcceptTcpClientCallback方法),因此系统会自动将该状态信息从关联的BeginAcceptTcpClient方法传递到AcceptTcpClientCallback方法。注意在回调代码中,必须调用EndAcceptTcpClient方法完成客户端连接。关键代码为:
void AcceptTcpClientCallback( IAsyncResult ar)
{
……
TcpListener myListener = (TcpListener)ar.AsyncState;
TcpClient client = myListener.EndAcceptTcpClient(ar);
……
}
程序执行EndAcceptTcpClient方法后,会自动完成客户端连接请求,并返回包含底层套接字的TcpClient对象,接下来我们就可以利用这个对象与客户端进行通信了。
默认情况下,程序执行BeginAcceptTcpClient方法后,在该方法返回状态信息之前,不会像同步TCP方式那样阻塞等待客户端连接,而是继续往下执行。如果我们希望在其返回状态信息之前阻塞当前线程的执行,可以调用ManualResetEvent对象的WaitOne方法。
BeginConnect方法和EndConnect方法
AsyncCallback requestCallback = new AsyncCallback(RequestCallback);
tcpClient.BeginConnect(远程主机IP或域名,远程主机端口号 , requestCallback, tcpClient);
……
void RequestCallback(IAsyncResult ar)
{
……
tcpClient = (TcpClient)ar.AsyncState;
client.EndConnect(ar);
……
}
发送数据
在异步TCP应用编程中,如果本机已经和远程主机建立连接,就可以用System.Net.Sockets命名空间下NetworkStream类中的BeginWrite方法发送数据。其方法原型为:
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, Object state);
异步TCP---简单聊天例子/Files/fujinliang/AsyncTcpServer.rar