zoukankan      html  css  js  c++  java
  • 异步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

  • 相关阅读:
    【css】rem及其替换方案
    【css】如何实现环形进度条
    【js】我们需要无限滚动列表吗?
    【js】再谈移动端的模态框实现
    【js】callback时代的变更
    【js】为什么要使用react+redux
    【js】JavaScript parser实现浅析
    【css】回想下经典的布局
    【JS】温故知新: 从parseInt开始
    【渲染原理】浏览器渲染原理的个人整理
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2557064.html
Copyright © 2011-2022 走看看