版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 TCP應(yīng)用編程,5.1 TCP應(yīng)用編程概述 5.2 利用同步TCP編寫網(wǎng)絡(luò)聊天程序 5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲 5.4 異步TCP應(yīng)用編程 5.5 異步TCP編程舉例,第5章 TCP應(yīng)用編程(續(xù)),本章教學(xué)目的 通過(guò)學(xué)習(xí),使學(xué)生掌握涉及的知識(shí)點(diǎn),能對(duì)TCP同步編程流程有深入認(rèn)識(shí),并熟悉異步TCP編程的基本概念和異步TCP應(yīng)用編程的一般方法。 本章教學(xué)要求 (1)掌握TCP的特點(diǎn)、涉及到相關(guān)類、TCP應(yīng)用編程的一般步驟以及怎樣解決無(wú)消息邊界問(wèn)題 ; (2)掌握同步TCP編程的流程和使用方法。 (3)掌握異步設(shè)計(jì)模式、異步TCP應(yīng)用編程的一般方法。 教學(xué)難點(diǎn)和重點(diǎn) TCP應(yīng)用編程的
2、一般步驟,如何開辟多線程與多個(gè)客戶打交道,如何實(shí)現(xiàn)服務(wù)器和客戶端相關(guān)功能。異步設(shè)計(jì)模式實(shí)現(xiàn)。,5.1 TCP應(yīng)用編程概述,5.1.1 TCP簡(jiǎn)介 5.1.2 TcpListener類與TcpClient類 5.1.3 TCP應(yīng)用編程的一般步驟 5.1.4 TCP的無(wú)消息邊界問(wèn)題,5.1.1 TCP簡(jiǎn)介,TCP是Transmission Control Protocol(傳輸控制協(xié)議)的簡(jiǎn)稱,是TCP/IP體系中面向連接的運(yùn)輸層協(xié)議,在網(wǎng)絡(luò)中提供全雙工的和可靠的服務(wù)。 TCP最主要的特點(diǎn): (1)是面向連接的傳輸層協(xié)議; (2)每個(gè)TCP連接只能有兩個(gè)端點(diǎn),而且只能一對(duì)一通信,不能一點(diǎn)對(duì)多點(diǎn)直接
3、通信。 (3)通過(guò)TCP連接傳送的數(shù)據(jù),能保證數(shù)據(jù)無(wú)差錯(cuò)、不丟失、不重復(fù)地準(zhǔn)確到達(dá)接收方,并且保證各數(shù)據(jù)到達(dá)的順序與數(shù)據(jù)發(fā)出的順序相同。 (4)數(shù)據(jù)以字節(jié)流的方式傳輸。 (5)傳輸?shù)臄?shù)據(jù)無(wú)消息邊界。,5.1.1 TCP簡(jiǎn)介(續(xù)),利用TCP開發(fā)應(yīng)用程序時(shí),.NET框架提供兩種工作方式. (1)同步工作方式 指利用TCP編寫的程序執(zhí)行到發(fā)送、接收或監(jiān)聽語(yǔ)句時(shí),在未完成工作前不再繼續(xù)往下執(zhí)行,即處于阻塞狀態(tài),直到該語(yǔ)句完成相應(yīng)的工作后才繼續(xù)執(zhí)行下一條語(yǔ)句; (2)異步工作方式 異步工作方式是指程序執(zhí)行到發(fā)送、接收或監(jiān)聽語(yǔ)句時(shí),不論工作是否完成,都會(huì)繼續(xù)往下執(zhí)行。 例如:同步接收數(shù)據(jù)時(shí),接收方執(zhí)行到
4、接收語(yǔ)句后將處于阻塞方式,只有接收到對(duì)方發(fā)來(lái)的數(shù)據(jù)后才繼續(xù)執(zhí)行下一條語(yǔ)句;而如果采用異步工作方式,則接收方在執(zhí)行到接收語(yǔ)句后,無(wú)論是否接收到對(duì)方發(fā)來(lái)的數(shù)據(jù),程序都繼續(xù)往下執(zhí)行。,5.1.1 TCP簡(jiǎn)介(續(xù)),思考:這里的同步TCP和異步TCP與線程同步異步是否概念是否相同? 回答: (1)這里的同步TCP和異步TCP僅僅指工作方式,它和線程間的同步不是一個(gè)概念。 (2)線程間的同步指不同線程或其共享資源具有先后關(guān)聯(lián)的關(guān)系,而同步TCP和異步TCP則僅僅指TCP編程中采用哪種工作方式,即是從執(zhí)行到發(fā)送、接收或監(jiān)聽語(yǔ)句時(shí),程序是否繼續(xù)往下執(zhí)行這個(gè)角度來(lái)說(shuō)的。,5.1.2 TcpListener類與
5、TcpClient類,TcpListener類與TcpClient類兩個(gè)類均封裝了底層的套接字,并分別提供了對(duì)套接字進(jìn)一步封裝后的同步和異步操作的方法,降低了TCP應(yīng)用編程的難度。 TcpListener類用于偵聽和接受傳入的連接請(qǐng)求。 TcpClient類用于提供本地主機(jī)和遠(yuǎn)程主機(jī)的連接信息。 注意,TcpListener和TcpClient只支持標(biāo)準(zhǔn)協(xié)議編程。如果希望編寫非標(biāo)準(zhǔn)協(xié)議的程序,只能使用套接字來(lái)實(shí)現(xiàn)。,5.1.2 TcpListener類與TcpClient類(續(xù)),TcpListener類 TcpLISTener類在System.Net.Socket命名空間下。 常用的構(gòu)造函數(shù)
6、有兩種:TcpListener(IPEndPoint iep) TcpListener(IPAddress localAddr, int port) 舉例: IPAddress ipAddress = Dns.Resolve(localhost).AddressList0; Try TcpListener tcpListener = new TcpListener(ipAddress, 1326); catch ( Exception e) Console.WriteLine( e.ToString(); ,5.1.2 TcpListener類與TcpClient類(續(xù)),在同步工作方式下,
7、TcpListener類常用的方法: Start啟動(dòng)監(jiān)聽,構(gòu)造函數(shù)為:public void Start(int backlog)參數(shù)backlog為請(qǐng)求隊(duì)列的最大長(zhǎng)度,即最多允許的的客戶端請(qǐng)求連接個(gè)數(shù); Stop關(guān)閉TcpListener并停止監(jiān)聽請(qǐng)求,構(gòu)造函數(shù)為:public void Stop(); AcceptSocket 在同步阻塞方式下獲取并返回一個(gè)用來(lái)接收和發(fā)送數(shù)據(jù)的Socket對(duì)象,同時(shí)從傳入的連接隊(duì)列中移除該客戶端的連接請(qǐng)求。 AcceptTcpClient在同步阻塞方式下獲取并返回一個(gè)封裝了Socket的TcpClient對(duì)象,同時(shí)從傳入的連接隊(duì)列中移除該客戶端的連接請(qǐng)求。
8、,5.1.2 TcpListener類與TcpClient類(續(xù)),TcpClient類 TcpClient類在System.Net.Socket命名空間下。 主要用于編寫客戶端程序,且需要直接利用構(gòu)造函數(shù)創(chuàng)建TcpClient對(duì)象。而服務(wù)器端程序中是通過(guò)TcpListener對(duì)象的AcceptTcpClient方法得到TcpClient對(duì)象的,所以不需要使用TcpClient類的構(gòu)造函數(shù)來(lái)創(chuàng)建TcpClient對(duì)象。 構(gòu)造函數(shù)有四種重載形式 TcpClient() TcpClient(AddressFamily family) TcpClient(IPEndPoint iep) TcpCli
9、ent(string hostname,int port),5.1.2 TcpListener類與TcpClient類(續(xù)),(1)TcpClient() 該構(gòu)造函數(shù)創(chuàng)建一個(gè)默認(rèn)的TcpClient對(duì)象,并自動(dòng)分配本機(jī)(客戶端)IP地址和端口號(hào)。利用此構(gòu)造函數(shù)創(chuàng)建對(duì)象后,還必須調(diào)用Connect方法與服務(wù)器建立連接。 例如: TcpClient tcpClient=new TcpClient(); tcpClient.Connect(, 51888);,5.1.2 TcpListener類與TcpClient類(續(xù)),(2)TcpClient(AddressFamily family) 該構(gòu)造
10、函數(shù)創(chuàng)建的TcpClient對(duì)象也能自動(dòng)分配本機(jī)(客戶端)IP地址和端口號(hào),但是使用AddressFamily枚舉指定使用哪種網(wǎng)絡(luò)協(xié)議。創(chuàng)建該對(duì)象后,必須調(diào)用Connect方法與服務(wù)器建立連接。 例如: TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork); tcpClient.Connect(, 51888);,5.1.2 TcpListener類與TcpClient類(續(xù)),(3)TcpClient(IPEndPoint iep) 該構(gòu)造函數(shù)的參數(shù)iep指定本機(jī)(客戶端)IP地址與端口號(hào)。當(dāng)客戶端有一個(gè)以上的IP地址
11、時(shí),而且程序員希望直接指定使用的IP地址和端口號(hào),可以使用這種方式。如果使用這種方式,必須調(diào)用Connect方法與服務(wù)器建立連接。例如: IPAddress address = Dns.GetHostAddresses(Dns.GetHostName(); IPEndPoint iep = new IPEndPoint(address0, 51888); TcpClient tcpClient = new TcpClient(iep); tcpClient.Connect(, 51888);,5.1.2 TcpListener類與TcpClient類(續(xù)),(4)TcpClient(strin
12、g hostname,int port) 這是使用最方便的一種構(gòu)造函數(shù)。參數(shù)中的hostname表示要連接到的遠(yuǎn)程主機(jī)的DNS名,port表示要連接到的遠(yuǎn)程主機(jī)的端口號(hào)。該構(gòu)造函數(shù)會(huì)自動(dòng)分配最合適的本地主機(jī)IP地址和端口號(hào),并對(duì)DNS進(jìn)行解析,然后與遠(yuǎn)程主機(jī)建立連接。例如: TcpClient tcpClient = new TcpClient(, 51888); 它相當(dāng)于: TcpClient tcpClient = new TcpClient(); tcpClient Connect(,51888);,5.1.2 TcpListener類與TcpClient類(續(xù)),TcpClient類的
13、常用屬性,5.1.2 TcpListener類與TcpClient類(續(xù)),TcpClient類的常用方法,5.1.2 TcpListener類與TcpClient類(續(xù)),TcpClient用法舉例: TcpClient tcpClient = new TcpClient(); tcpClient.Connect(contosoServer, 11000); NetworkStream networkStream = tcpClient.GetStream(); networkStream.ReadTimeout = 10; byte bytes = new byte1024; networ
14、kStream.Read(bytes, 0, 1024); string data = Encoding.UTF8.GetString(bytes); networkStream.Close(); tcpClient.Close();,5.1.3 TCP應(yīng)用編程的一般步驟,不論是多么復(fù)雜的TCP應(yīng)用程序,網(wǎng)絡(luò)通信的最基本前提就是客戶端要先和服務(wù)器建立TCP連接,然后才可以在此基礎(chǔ)上相互傳輸數(shù)據(jù)。由于服務(wù)器需要同時(shí)為多個(gè)客戶端服務(wù),因此程序相對(duì)復(fù)雜一些。 在服務(wù)器端,程序員需要編寫程序不斷地監(jiān)聽客戶端是否有連接請(qǐng)求,一旦接受了客戶端連接請(qǐng)求,即能識(shí)別是哪個(gè)客戶;而客戶端與服務(wù)器連接則相對(duì)比較簡(jiǎn)單
15、,只需要指定連接哪個(gè)服務(wù)器即可。一旦雙方建立了連接并創(chuàng)建了對(duì)應(yīng)的套接字,就可以相互傳輸數(shù)據(jù)了。在程序中,發(fā)送和接收數(shù)據(jù)的方法都是一樣的,區(qū)別僅是方向不同。,5.1.3 TCP應(yīng)用編程的一般步驟(續(xù)),編寫服務(wù)器端程序的一般步驟為: 使用對(duì)套接字封裝后的類,編寫基于TCP的服務(wù)器端程序的 一般步驟為: (1)創(chuàng)建一個(gè)TcpListener對(duì)象,然后調(diào)用該對(duì)象的Start方法在指定的端口進(jìn)行監(jiān)聽。 (2)在單獨(dú)的線程中,循環(huán)調(diào)用AcceptTcpClient方法接受客戶端的連接請(qǐng)求,并根據(jù)該方法的返回的結(jié)果得到與該客戶端對(duì)應(yīng)的TcpClient對(duì)象。 (3)每得到一個(gè)新的TcpClient對(duì)象,就
16、創(chuàng)建一個(gè)與該客戶對(duì)應(yīng)的線程,在線程中與對(duì)應(yīng)的客戶進(jìn)行通信。 (4)根據(jù)傳送信息的情況確定是否關(guān)閉與客戶的連接。,5.1.3 TCP應(yīng)用編程的一般步驟(續(xù)),編寫客戶端程序的一般步驟為: 使用對(duì)套接字封裝后的類,編寫基于TCP的客戶端程序的一 般步驟如下: (1)利用TcpClient的構(gòu)造函數(shù)創(chuàng)建一個(gè)TcpClient對(duì)象。 (2)使用Connect方法與服務(wù)器建立連接。 (3)利用TcpClient對(duì)象的GetStream方法得到網(wǎng)絡(luò)流,然后利用該網(wǎng)絡(luò)流與服務(wù)器進(jìn)行數(shù)據(jù)傳輸。 (4)創(chuàng)建一個(gè)線程監(jiān)聽指定的端口,循環(huán)接收并處理服務(wù)器發(fā)送過(guò)來(lái)的信息。 (5)完成工作后,向服務(wù)器發(fā)送關(guān)閉信息,并關(guān)
17、閉與服務(wù)器的連接。,5.1.4 TCP的無(wú)消息邊界問(wèn)題,在網(wǎng)絡(luò)傳輸中,可能會(huì)出現(xiàn)發(fā)送方一次發(fā)送的消息與接收方一次接收的消息不一致的現(xiàn)象。這主要是因?yàn)門CP協(xié)議是字節(jié)流形式的、無(wú)消息邊界的協(xié)議,由于受網(wǎng)絡(luò)傳輸中的不確定因素的影響,因此不能保證單個(gè)Send方法發(fā)送的數(shù)據(jù)被單個(gè)Receive方法讀取。 實(shí)際應(yīng)用中,解決TCP協(xié)議消息邊界問(wèn)題的方法有三種: 發(fā)送固定長(zhǎng)度的消息,該方法適用于消息長(zhǎng)度固定的場(chǎng)合。 將消息長(zhǎng)度與消息一起發(fā)送,這種方法適用于任何場(chǎng)合。 使用特殊標(biāo)記分隔消息,這種方法主要用于消息中不包含特殊標(biāo)記的場(chǎng)合。,5.2 利用同步TCP編寫網(wǎng)絡(luò)聊天程序,【例5-1】利用同步TCP和Bin
18、aryReader及BinaryWriter對(duì)象編寫一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序。功能要求: (1)任何一個(gè)客戶端,均可以與服務(wù)器進(jìn)行通信。 (2)服務(wù)器要能顯示客戶端連接的狀態(tài),當(dāng)客戶端連接成功后,要自動(dòng)及時(shí)告知客戶端已經(jīng)連接成功的信息,并將當(dāng)前在線的所有客戶告知該客戶端。 (3)客戶和服務(wù)器建立連接后,即可以通過(guò)服務(wù)器和任一個(gè)在線的其他客戶聊天。 (4)不論客戶何時(shí)退出程序,服務(wù)器都要做出正確判斷,同時(shí)將該客戶是否在線的情況告訴其他所有在線的客戶。,5.2 利用同步TCP編寫網(wǎng)絡(luò)聊天程序(續(xù)),服務(wù)器端設(shè)計(jì)界面,圖5-1 服務(wù)器設(shè)計(jì)界面,5.2 利用同步TCP編寫網(wǎng)絡(luò)聊天程序(續(xù)),客戶端設(shè)計(jì)界
19、面,圖5-2 聊天客戶端設(shè)計(jì)界面,5.2 利用同步TCP編寫網(wǎng)絡(luò)聊天程序(續(xù)),運(yùn)行效果,圖5-3 例5-1的運(yùn)行效果,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲,【例5-2】編寫一個(gè)可以通過(guò)因特網(wǎng)對(duì)弈的“吃棋子”游戲。功能要求: 1) 服務(wù)器可以同時(shí)服務(wù)多桌,每桌允許兩個(gè)玩家通過(guò)因特網(wǎng)對(duì)弈。 2) 允許玩家自由選擇坐在哪一桌的哪一方。如果兩個(gè)玩家坐在同一桌,雙方應(yīng)都能看到對(duì)方的狀態(tài)。兩個(gè)玩家均單擊“開始”按鈕,游戲就開始了。 3) 某桌游戲開始后,服務(wù)器以固定的時(shí)間間隔同時(shí)在1515的棋盤方格內(nèi)向該桌隨機(jī)地發(fā)送黑白兩種顏色的棋子位置,客戶端程序接收到服務(wù)器發(fā)送的棋子位置和顏色后,在1515棋盤的相應(yīng)
20、位置顯示棋子。 4) 玩家坐到游戲桌座位上后,不論游戲是否開始,該玩家都可以隨時(shí)調(diào)整服務(wù)器發(fā)送棋子的時(shí)間間隔。,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),5) 游戲開始后,客戶端程序響應(yīng)鼠標(biāo)單擊。每當(dāng)玩家單擊了某個(gè)棋子,該棋子就會(huì)從棋盤上消失,同時(shí)具有相應(yīng)顏色的玩家得1分。注意,如果玩家單擊了對(duì)方顏色的棋子,則對(duì)方得1分。 6) 如果兩個(gè)相同顏色的棋子在水平方向或垂直方向是相鄰的,那么就認(rèn)為這兩個(gè)棋子是相鄰的。這里不考慮對(duì)角線相鄰的情況。如果相同顏色的棋子出現(xiàn)在相鄰的位置,游戲就結(jié)束了。該顏色對(duì)應(yīng)的玩家就是失敗者。 7) 同一桌的兩個(gè)玩家可以聊天。 這個(gè)游戲雖然比較簡(jiǎn)單,但卻是“麻雀雖小、五臟
21、俱全”。如果讀者真正理解了編寫的方法,就可以輕松編寫各類基于C/S模式的因特網(wǎng)應(yīng)用程序。,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),服務(wù)器端編程 服務(wù)器啟動(dòng)服務(wù)后,需要?jiǎng)?chuàng)建一個(gè)線程專門用于監(jiān)聽玩家的連接請(qǐng)求。在監(jiān)聽線程中,服務(wù)器一旦接受一個(gè)連接,就創(chuàng)建一個(gè)與該玩家對(duì)應(yīng)的線程,用于接收該玩家發(fā)送的信息,并根據(jù)該玩家發(fā)送的信息提供相應(yīng)的服務(wù)。 有多少個(gè)玩家連接,就創(chuàng)建多少個(gè)對(duì)應(yīng)的線程。玩家退出游戲室,其對(duì)應(yīng)的線程自動(dòng)終止。服務(wù)器可以限制進(jìn)入游戲室的玩家數(shù)量,具體可以同時(shí)進(jìn)入多少玩家,可以根據(jù)服務(wù)器內(nèi)存容量以及服務(wù)器運(yùn)行速度決定。 在與每個(gè)玩家對(duì)應(yīng)的線程中,服務(wù)器收到對(duì)應(yīng)玩家發(fā)送的字符串信息后,需要
22、解析字符串的含義,并決定服務(wù)器需要的操作。,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),服務(wù)器端設(shè)計(jì)界面,圖5-4 服務(wù)器設(shè)計(jì)界面,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),客戶端編程 客戶端與服務(wù)器連接成功后,需要?jiǎng)?chuàng)建一個(gè)接收線程,用于接收服務(wù)器發(fā)送的信息。在接收線程中,客戶端收到服務(wù)器發(fā)送的字符串信息后,也需要解析字符串的含義,并決定需要的操作。 客戶端還需要根據(jù)服務(wù)器發(fā)送的命令,及時(shí)更新客戶端程序的運(yùn)行界面 。,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),客戶端設(shè)計(jì)界面(1),圖5-5 棋盤棋子與設(shè)計(jì)界界面,5.3 利用同步TCP編寫網(wǎng)絡(luò)游戲(續(xù)),客戶端設(shè)計(jì)界面(2),圖5-6 客戶端Fo
23、rmPlaying.cs的設(shè)計(jì)界面,5.4 異步TCP應(yīng)用編程,5.4.1 異步設(shè)計(jì)模式概述 5.4.2 異步TCP應(yīng)用編程的一般方法 5.4.3 使用異步方式調(diào)用同步方法,5.4.1 異步編程模式概述,什么是異步編程 異步操作方式:某個(gè)工作開始以后,能在這個(gè)工作尚未完成的時(shí)候繼續(xù)處理其他工作。異步操作一般在單獨(dú)的線程中執(zhí)行,調(diào)用異步方法異步執(zhí)行某個(gè)操作時(shí),可同時(shí)繼續(xù)執(zhí)行該異步方法后面的代碼。 異步編程:使用異步操作方式編寫程序。異步編程用于異步操作執(zhí)行完成時(shí)間可能較長(zhǎng)的任務(wù),如打開大文件、連接遠(yuǎn)程計(jì)算機(jī)或查詢數(shù)據(jù)庫(kù)等. 異步編程的兩種設(shè)計(jì)模式: 基于事件的異步設(shè)計(jì)模式:簡(jiǎn)化異步編程復(fù)雜度,適
24、用一般程序員 基于IAsyncResult的異步設(shè)計(jì)模式:功能全,適用有經(jīng)驗(yàn)的程序員,5.4.1 異步編程模式概述(續(xù)),基于事件的異步設(shè)計(jì)模式 該模式用事件驅(qū)動(dòng)模型實(shí)現(xiàn)異步方法。 這種模式用單獨(dú)的線程在后臺(tái)執(zhí)行耗時(shí)的任務(wù),當(dāng)后臺(tái)任務(wù)完成時(shí),就自動(dòng)觸發(fā)對(duì)應(yīng)的事件。 優(yōu)點(diǎn):該模式既具有多線程應(yīng)用程序的優(yōu)點(diǎn),同時(shí)也隱匿了多線程設(shè)計(jì)中固有的許多復(fù)雜問(wèn)題。 例如:BackgroundWorker組件 ,PictureBox控件,5.4.1 異步編程模式概述(續(xù)),在.NET中,提供異步處理功能的有: 文件 I/O、流 I/O、套接字 I/O。 網(wǎng)絡(luò)。 遠(yuǎn)程處理信道(HTTP、TCP)和代理。 使用 A
25、SP.NET 創(chuàng)建的 XML Web services。 ASP.NET Web 窗體。 使用 MessageQueue 類的消息隊(duì)列。 BackgroundWorker等組件,5.4.1 異步編程模式概述(續(xù)),基于事件的異步設(shè)計(jì)模式的特點(diǎn)(例子見設(shè)計(jì)型實(shí)驗(yàn)preMainForm.cs) 用事件驅(qū)動(dòng)模型實(shí)現(xiàn)異步方法,適用于絕大多數(shù)異步應(yīng)用,降低了異步編程的復(fù)雜性。建議盡量使用這種設(shè)計(jì)模式。 具有多線程應(yīng)用程序的優(yōu)點(diǎn),同時(shí)隱匿了多線程設(shè)計(jì)中固有的許多復(fù)雜問(wèn)題。 在“后臺(tái)”執(zhí)行耗時(shí)任務(wù)(例如下載和數(shù)據(jù)庫(kù)操作),但不會(huì)中斷應(yīng)用程序。當(dāng)后臺(tái)任務(wù)完成時(shí),就自動(dòng)觸發(fā)對(duì)應(yīng)的事件。 可以同時(shí)執(zhí)行多個(gè)操作,每
26、個(gè)操作完成時(shí)都會(huì)接到通知。 后臺(tái)等待資源時(shí),不會(huì)停止(“掛起”)應(yīng)用程序。 使用熟悉的事件和委托模型與掛起的異步操作通信。 支持基于事件的異步模式的類一般都有一個(gè)或多個(gè)后綴為 “Async” 的方法。該類還可能有一個(gè)后綴為“Completed”的事件,以及后綴為“AsyncCancel”(或只有 CancelAsync)的方法。,5.4.1 異步編程模式概述(續(xù)),支持基于事件的異步設(shè)計(jì)模型的組件或控件舉例 PictureBox控件:提供了異步的LoadAsync 方法,比如異步下載圖像,程序調(diào)用LoadAsync方法時(shí),會(huì)繼續(xù)執(zhí)行該語(yǔ)句后面的語(yǔ)句,而下載操作將在另一個(gè)線程上(后臺(tái))進(jìn)行。下載
27、完成時(shí),線程會(huì)自動(dòng)觸發(fā)LoadCompleted事件。基于事件的異步模式要求異步操作可以取消,PictureBox提供的與之對(duì)應(yīng)的方法名為CancelAsync。 BackgroundWork組件:能完成絕大多數(shù)異步編程功能。建議盡量使用它實(shí)現(xiàn)異步操作。 除了這兩個(gè)以外,其他很多組件或控件也支持異步操作。例如SoundPlayer組件、WebClient類等,5.4.1 異步編程模式概述(續(xù)),基于IAsyncResult的異步設(shè)計(jì)模式 通過(guò)前綴分別為“Begin”和“End”的兩個(gè)方法實(shí)現(xiàn)開始和結(jié)束異步操作,例如FileStream類提供BeginRead和EndRead方法來(lái)從文件異步讀取
28、字節(jié)。程序在調(diào)用Begin后,可以在調(diào)用線程上繼續(xù)執(zhí)行其下面的指令,同時(shí)異步操作在另一個(gè)線程上執(zhí)行。 Begin方法開始異步操作,并返回一個(gè)實(shí)現(xiàn) IAsyncResult接口的對(duì)象。 IAsyncResult對(duì)象存儲(chǔ)有關(guān)異步操作的狀態(tài)信息。這些信息包括: IAsyncState:可選的特定的對(duì)象,包含異步操作需要的信息。 AsyncWaitHandle:用于在異步操作完成前阻止程序執(zhí)行。 CompletedSynchronously:指示異步操作是否在用于調(diào)用Begin的線程上完成,而不是在單獨(dú)的ThreadPool線程上完成。 IsCompleted:一個(gè)布爾值,指示異步操作是否已完成。 特
29、點(diǎn) 適用面廣、靈活性高、但學(xué)習(xí)起來(lái)比事件設(shè)計(jì)模式復(fù)雜。 每次調(diào)用Begin后,程序還應(yīng)調(diào)用End來(lái)獲取操作的結(jié)果。,5.4.1 異步編程模式概述(續(xù)),(1)Begin方法和end方法成對(duì)出現(xiàn):程序調(diào)用異步操作的Begin方法時(shí),系統(tǒng)會(huì)自動(dòng)在線程池中創(chuàng)建對(duì)應(yīng)的線程進(jìn)行異步操作,從而保證調(diào)用方和被調(diào)用方同時(shí)執(zhí)行。 (2)當(dāng)線程池中的Begin方法執(zhí)行完畢時(shí),會(huì)自動(dòng)通過(guò)AsyncCallback委托調(diào)用在Begin方法的參數(shù)中指定的回調(diào)方法。,5.4.1 異步編程模式概述(續(xù)),如何理解異步設(shè)計(jì)模式(對(duì)比舉例),5.4.2 異步TCP應(yīng)用編程的一般方法,使用異步TCP編程時(shí),除了套接字有對(duì)應(yīng)的異步
30、操作方式外,TcpListener和TcpClient類均提供了返回結(jié)果為IasyncResult類型的異步操作的方法。見下頁(yè)表。,5.4.2 異步TCP應(yīng)用編程的一般方法,1BeginAcceptTcpClient方法和EndAcceptTcpClient方法 BeginAcceptTcpClient:程序執(zhí)行BeginAcceptTcpClient方法后,會(huì)立即在線程池中自動(dòng)創(chuàng)建一個(gè)線程,同時(shí)在該線程中監(jiān)聽客戶端連接請(qǐng)求。一旦接受了客戶端連接請(qǐng)求,就通過(guò)委托執(zhí)行相應(yīng)的方法,并返回狀態(tài)信息。 public IAsyncResult BeginAcceptTcpClient(AsyncCall
31、back callback, Object state) 參數(shù)1:AsyncCallback類型的委托, 參數(shù)2:Object類型,用于將狀態(tài)信息傳遞給委托調(diào)用的方法。,回調(diào)方法名,5.4.2 異步TCP應(yīng)用編程的一般方法,1BeginAcceptTcpClient方法和EndAcceptTcpClient方法 回調(diào)方法中傳遞的參數(shù)只有一個(gè),而且必須是 IAsyncResult類型的接口,它表示異步操作的狀態(tài),如果有多個(gè)狀態(tài)需要傳遞,可以將其事先封裝到某個(gè)類中 AsyncCallback callback = new AsyncCallback(AcceptClient); tcpListen
32、er.BeginAcceptTcpClient(callback, tcpListener); . void AcceptClient( IAsyncResult ar) TcpListener myListener = (TcpListener)ar.AsyncState; TcpClient client = myListener.EndAcceptTcpClient(ar); ,5.4.2 異步TCP應(yīng)用編程的一般方法,2BeginConnect方法和EndConnect方法 在BeginConnect方法操作完成前,調(diào)用該方法的線程不會(huì)阻塞,系統(tǒng)會(huì)自動(dòng)用獨(dú)立的線程來(lái)執(zhí)行該方法,直到與遠(yuǎn)
33、程主機(jī)連接成功或拋出異常。 public IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback requestCallback, Object state); 參數(shù):address為遠(yuǎn)程主機(jī)的IPAddress對(duì)象; port為遠(yuǎn)程主機(jī)的端口號(hào); requestCallback為AsyncCallback類型的委托; state為包含連接操作的相關(guān)信息,當(dāng)操作完成時(shí),此對(duì)象會(huì)被傳遞給requestCallback委托。,5.4.2 異步TCP應(yīng)用編程的一般方法,2BeginConnect方法和EndConnec
34、t方法 AsyncCallback requestCallback = new AsyncCallback(FinishConnect); tcpClient.BeginConnect(遠(yuǎn)程主機(jī)IP或域名,遠(yuǎn)程主機(jī)端口號(hào), requestCallback, tcpClient); void FinishConnect (IAsyncResult ar) tcpClient = (TcpClient)ar.AsyncState; client.EndConnect(ar); 在自定義的FinishConnect方法中,通過(guò)獲取的狀態(tài)信息得到新的TcpClient 類型的對(duì)象,并調(diào)用EndConnect完成連接請(qǐng)求。,同步參數(shù),委托,Object參數(shù),5.4.2 異步TCP應(yīng)用編程的一般方法,3異步發(fā)送和接收數(shù)據(jù) public override IAsyncResult BeginWrite(byte buffer, int offset, int size, AsyncCallback callback, Object state); public override IAsyn
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年開發(fā)商與購(gòu)房者長(zhǎng)租公寓買賣合同范本3篇
- 二零二五年度餐飲服務(wù)業(yè)勞動(dòng)合同模板及食品安全3篇
- 二零二五版特種動(dòng)物繁育與購(gòu)銷一體化服務(wù)合同3篇
- 二零二五年教育機(jī)構(gòu)教學(xué)資源整合合同書3篇
- 二零二五年空壓機(jī)租賃與應(yīng)急響應(yīng)服務(wù)合同3篇
- 二零二五年教育培訓(xùn)機(jī)構(gòu)代理招生合同模板3篇
- 二零二五版未成年人撫養(yǎng)權(quán)變更合同3篇
- 二零二五年度財(cái)務(wù)風(fēng)險(xiǎn)控制合同3篇
- 二零二五年度鋼材采購(gòu)與智能制造合作合同3篇
- 二零二五版豪華游輪包船旅游運(yùn)輸服務(wù)合同參考模板2篇
- 2024版?zhèn)€人私有房屋購(gòu)買合同
- 2025年山東光明電力服務(wù)公司招聘筆試參考題庫(kù)含答案解析
- 《神經(jīng)發(fā)展障礙 兒童社交溝通障礙康復(fù)規(guī)范》
- 2025年中建六局二級(jí)子企業(yè)總經(jīng)理崗位公開招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年5月江蘇省事業(yè)單位招聘考試【綜合知識(shí)與能力素質(zhì)】真題及答案解析(管理類和其他類)
- 注漿工安全技術(shù)措施
- 2024年世界職業(yè)院校技能大賽“食品安全與質(zhì)量檢測(cè)組”參考試題庫(kù)(含答案)
- 3-9年級(jí)信息技術(shù)(人教版、清華版)教科書資源下載
- 上海牛津版三年級(jí)英語(yǔ)3B期末試卷及答案(共5頁(yè))
- 行為疼痛量表BPS
- 小學(xué)生必背古詩(shī)詞80首(硬筆書法田字格)
評(píng)論
0/150
提交評(píng)論