標准的網絡編程模式有一個缺點,就是如果Socker類的I/O方法不能立即處理,I/O方法就會阻塞(Block)。阻塞是指程序停止執行,等待個特殊語句的完成。如當一個程序執行到Receive方法的時候,程序會停止執行,直到在套接字上讀到的數據為止。如果遠程設備不發送任何數據,程序就不能繼續下去。對於單一連接的客戶端/服務器程序這種方式也許可以正常工作,但對於必須連續處理其祂事件的程序就會引起問題。有3個可以避免使用阻塞網絡調用的C#技朮:無阻塞套接字、多路傳套接字和異步套接字。

     1無阻塞套接字

       有一個簡單的防止阻塞的方法以,就是把套接字設置成非阻塞的。如:

      Socket sock=new  Socket(AffressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);

      sock.Blocking=false;

     當套接字是非阻塞模式的時候,就不會一直等待一個I/O方法的完成,就是說,如果在規定時間內該方法不能完成,程序繼續執行。比如對於Receive方法,如果Blocking設為false,Receive將不等待數據出現在套接字上,而是返回一個0值,表示在套接字上沒有可用的數據。

      2多路傳輸套接字

        另外一個解決套接字阻塞問題的方法是使用Socket類提供的Select方法,這個方法用於多路傳輸多個套接字實例,以便找到一個已經准備好進行讀或字的套接字。格式如下:

        Select(IList read,IList write ,IList error,int microseconds)

        read 、write、error都是IList對象,這些對象包含要監視的套接字數組。Microseconds參數據指定Select方法等待事件 時要等待多長時間以微秒為單位。用法如下:

        ArrayList socketList=new ArrayList(5);

        socketList.Add(sock1);

        socketList.Add(sock2);

      Socket.Select(socketList,null,null,1000);

       Byte[]   buffer=new  byte[1024]

       for(int i=0;i<socketList.Length;i++)

       {

          socketList[i].Receive(buffer);

       }

 注意:Select 方法將監視sock1和sock2兩個套接字上接收的數據。即使在兩個套接字上都不有數據出理,Receive方法也不會阻礙程序的執行。

      3 異套接字的編程技朮

      異理套接字編程技朮采用AsyncCallback委托為應用程序提供完成異理操作的方法。當某個網絡功能結束時將轉到AsyncCallback中提供的方法來結束網駱功能。這樣就要以在等待網絡操作完成自身的工作時,允許應用程序繼續處理其祂事件。

posted on 2008-12-08 18:01  Blade  阅读(325)  评论(0编辑  收藏  举报