資源描述:
《24基于C#的socket編程的TCP異步實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、基于C#的socket編程的TCP異步實現(xiàn)一、摘要 本篇博文闡述基于TCP通信協(xié)議的異步實現(xiàn)。?二、實驗平臺 VisualStudio2010?三、異步通信實現(xiàn)原理及常用方法3.1建立連接 在同步模式中,在服務器上使用Accept方法接入連接請求,而在客戶端則使用Connect方法來連接服務器。相對地,在異步模式下,服務器可以使用BeginAccept方法和EndAccept方法來完成連接到客戶端的任務,在客戶端則通過BeginConnect方法和EndConnect方法來實現(xiàn)與服務器的連接?! eginAccept在異步方式下傳入的連接嘗試
2、,它允許其他動作而不必等待連接建立才繼續(xù)執(zhí)行后面程序。在調(diào)用BeginAccept之前,必須使用Listen方法來偵聽是否有連接請求,BeginAccept的函數(shù)原型為:BeginAccept(AsyncCallbackAsyncCallback,Ojbectstate)參數(shù):AsyncCallBack:代表回調(diào)函數(shù)state:表示狀態(tài)信息,必須保證state中包含socket的句柄 使用BeginAccept的基本流程是:(1)創(chuàng)建本地終節(jié)點,并新建套接字與本地終節(jié)點進行綁定;(2)在端口上偵聽是否有新的連接請求;(3)請求開始接入新的連接,傳入S
3、ocket的實例或者StateOjbect的實例?! ⒖即a://定義IP地址IPAddresslocal=IPAddress.Parse("127.0,0,1");IPEndPointiep=newIPEndPoint(local,13000);//創(chuàng)建服務器的socket對象Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);server.Bind(iep);server.Listen(20);server.BeginAccec
4、pt(newAsyncCallback(Accept),server); 當BeginAccept()方法調(diào)用結(jié)束后,一旦新的連接發(fā)生,將調(diào)用回調(diào)函數(shù),而該回調(diào)函數(shù)必須包括用來結(jié)束接入連接操作的EndAccept()方法。該方法參數(shù)列表為SocketEndAccept(IAsyncResultiar)下面為回調(diào)函數(shù)的實例:voidAccept(IAsyncResultiar){//還原傳入的原始套接字SocketMyServer=(Socket)iar.AsyncState;//在原始套接字上調(diào)用EndAccept方法,返回新的套接字Socketse
5、rvice=MyServer.EndAccept(iar);} 至此,服務器端已經(jīng)準備好了??蛻舳藨ㄟ^BeginConnect方法和EndConnect來遠程連接主機。在調(diào)用BeginConnect方法時必須注冊相應的回調(diào)函數(shù)并且至少傳遞一個Socket的實例給state參數(shù),以保證EndConnect方法中能使用原始的套接字。下面是一段是BeginConnect的調(diào)用:Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)IPAdd
6、ressip=IPAddress.Parse("127.0.0.1");IPEndPointiep=newIPEndPoint(ip,13000);socket.BeginConnect(iep,newAsyncCallback(Connect),socket); EndConnect是一種阻塞方法,用于完成BeginConnect方法的異步連接誒遠程主機的請求。在注冊了回調(diào)函數(shù)后必須接收BeginConnect方法返回的IASynccReuslt作為參數(shù)。下面為代碼演示:voidConnect(IAsyncResultiar){Socketclie
7、nt=(Socket)iar.AsyncState;try{client.EndConnect(iar);}catch(Exceptione){Console.WriteLine(e.ToString());}finally{}}? 除了采用上述方法建立連接之后,也可以采用TcpListener類里面的方法進行連接建立。下面是服務器端對關于TcpListener類使用BeginAccetpTcpClient方法處理一個傳入的連接嘗試。以下是使用BeginAccetpTcpClient方法和EndAccetpTcpClient方法的代碼:publics
8、taticvoidDoBeginAccept(TcpListenerlistner){//開始