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