您的位置:首页 > 理论基础 > 计算机网络

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

2013-07-08 13:38 316 查看
源码

源码2:添加了IP地址、断开等的设置框。

来源:/article/5200011.html

异步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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: