异步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方法。
tcpClient.BeginConnect(远程主机IP或域名,远程主机端口号 , requestCallback, tcpClient);
……
void RequestCallback(IAsyncResult ar)
{
……
tcpClient = (TcpClient)ar.AsyncState;
client.EndConnect(ar);
……
}
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, Object state);
源码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);
相关文章推荐
- 异步TCP---简单聊天例子
- C#版异步TCP聊天服务器端简单代码示例
- Boost.asio实现的同步、异步TCP通信的简单例子
- Java tcp服务器框架 以及一个简单命令行聊天的测试例子
- Extjs中加载异步树的最简单例子实现
- socket 编程 TCP 实现简单聊天功能【转】
- Java TCP、IO流实现简单机器人聊天系统
- 非阻塞式服务器和客户端程序(TCP)【简单的原理例子】
- UDP 与 TCP的连接简单例子(服务端/客户端) VC
- tcp简单例子-python
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
- 利用TCP实现简单聊天程序
- 使用$.get()从数据库异步请求数据的简单例子
- 一个简单的tcp filter的例子
- TCP简单聊天
- TCP异步聊天
- 【Boost】boost库asio详解8——几个TCP的简单例子
- 【Boost】boost库asio详解8——几个TCP的简单例子
- Erlang简单gen_tcp例子
- java实现简单TCP聊天程序