异步TCP---简单聊天例子

异步TCP和同步TCP类似,和其他所有的异步调用一样:

几个基本的异步调用.

AsyncCallback委托

AsyncCallback委托用于引用异步操作完成时调用的回调方法。在异步操作方式下,由于程序可以在启动异步操作后继续执行其他代码,因此必须有一种机制,以保证该异步操作完成时能及时通知调用者。这种机制可以通过AsyncCallback委托实现。

    异步操作的每一个方法都有一个Begin…方法和End…方法,例如BeginAcceptTcpClientEndAcceptTcpClient。程序调用Begin…方法时,系统会自动在线程池中创建对应的线程进行异步操作,从而保证调用方和被调用方同时执行,当线程池中的Begin…方法执行完毕时,会自动通过AsyncCallback委托调用在Begin…方法的参数中指定的回调方法。

    回调方法是在程序中事先定义的,在回调方法中,通过End…方法获取Begin…方法的返回值和所有输入/输出参数,从而达到异步操作方式下完成参数传递的目的。

BeginAcceptTcpClient方法和EndAcceptTcpClient方法

 

BeginAcceptTcpClientEndAcceptTcpClient方法包含在System.Net.Sockets命名空间下的TcpListener类中。在异步TCP应用编程中,服务器端可以使用TcpListener类提供的BeginAcceptTcpClient方法开始接收新的客户端连接请求。在这个方法中,系统自动利用线程池创建需要的线程,并在操作完成时利用异步回调机制调用提供给它的方法,同时返回相应的状态参数,其方法原型为:

public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, Object state)

    其中:参数1AsyncCallback类型的委托;参数2Object类型,用于将状态信息传递给委托提供的方法。例如:

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

posted @ 2012-06-20 22:24  广拓小程序  阅读(9767)  评论(3编辑  收藏  举报