2013年3月11日多線程1socket_第1頁(yè)
2013年3月11日多線程1socket_第2頁(yè)
2013年3月11日多線程1socket_第3頁(yè)
2013年3月11日多線程1socket_第4頁(yè)
2013年3月11日多線程1socket_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、北京傳智播客教育 聊天程序(基于Socket,Thread)講師:馬倫理解委托理解簡(jiǎn)單的IO前提:簡(jiǎn)單回顧委托什么是委托?(安全的函數(shù)指針) 通俗:就是一個(gè)能存放符合某種格式(方法簽名)的方法的指針的清單 delegate void AddDel(int a,int b);委托創(chuàng)建方式準(zhǔn)備一個(gè)方法:string HelloU(string uName)/方法代碼聲 明 委 托:delegate 返回值類型 委托類型名(參數(shù)) 例子:delegate string DGSayHi(string uName);創(chuàng)建委托對(duì)象:DGSayHi dgSay=new DGSayHi(HelloU); 或者

2、:DGSayHi dgSay=HelloU;/new DGSayHi(HelloU);追加方法: bine(,)刪除方法:dgSay-=HelloU3;委托調(diào)用方式dgSay(binggo); /dgSay.Invoke(binggo); 委托作為參數(shù)聲明使用委托做參數(shù)的方法:void IntenationalSayHi(string uName,DGSayHi dgSh) /業(yè)務(wù)代碼dgSh(uName); /業(yè)務(wù)代碼 調(diào)用執(zhí)行:傳委托對(duì)象:InternationalSayHi(biggo,dgSay);直接傳有和委托相同方法簽名的方法:InternationalSayHi(biggo,He

3、lloU);InternationalSayHi(biggo,new DGSayHi(HelloU);委托原理*泛型委托、匿名函數(shù)匿名函數(shù)泛型委托Func,Action的由來(lái)模擬實(shí)現(xiàn)List的FindAll方法Lambda委托的異步調(diào)用(講完線程再講也行)BeginInvoke 異步調(diào)用EndInvoke 獲取異步調(diào)用的(方法)返回值IAsyncResult 異步操作的狀態(tài)AsyncResult 異步操作的結(jié)果(可以獲取當(dāng)前執(zhí)行的委托對(duì)象)using System.Runtime.Remoting.Messaging;注意:委托的異步調(diào)用只對(duì)單播委托 文件流字符串和字節(jié)數(shù)組轉(zhuǎn)換字節(jié)數(shù)組轉(zhuǎn)換成字

4、符串: String System.Text.Encoding.UTF8.GetString(byte)字符串轉(zhuǎn)換成字節(jié)數(shù)組:byte System.Text.Encoding.UTF8.GetBytes(String)FileStream 文件流FileStream對(duì)象表示在磁盤(pán)或網(wǎng)絡(luò)路徑上指向文件的流使用FileStream類對(duì)文件系統(tǒng)上的文件進(jìn)行讀取、寫(xiě)入、打開(kāi)和關(guān)閉操作FileStream對(duì)輸入輸出進(jìn)行緩沖,從而提高性能為什么不用File.ReadAllText()? 好處之一就是:對(duì)于大文件來(lái)說(shuō),F(xiàn)ileStream可以對(duì)文件采取分段讀取,即每次只讀取一部分到內(nèi)存。多 線 程幾個(gè)概念

5、進(jìn)程(Process):是Windows系統(tǒng)中的一個(gè)基本概念,它包含著一個(gè)運(yùn)行程序所需要的資源。進(jìn)程之間是相對(duì)獨(dú)立的,一個(gè)進(jìn)程無(wú)法直接訪問(wèn)另 一個(gè)進(jìn)程的數(shù)據(jù)(除非利用分布式計(jì)算方式),一個(gè)進(jìn)程運(yùn)行的失敗也不會(huì)影響其他進(jìn)程的運(yùn)行,Windows系統(tǒng)就是利用進(jìn)程把工作劃分為多個(gè)獨(dú)立的區(qū)域 的。進(jìn)程可以理解為一個(gè)程序的基本邊界。 要解決的問(wèn)題:為了使程序能并發(fā)執(zhí)行,(要并發(fā)執(zhí)行就要隔離進(jìn)程,使進(jìn)程獨(dú)立,即每個(gè)進(jìn)程有屬于自己的數(shù)據(jù)段、程序段、進(jìn)程控制塊)應(yīng)用程序域:它提供安全而通用的處理單元,公共語(yǔ)言運(yùn)行庫(kù)可使用它來(lái)提供應(yīng)用程序之間的隔離。您可以在具有同等隔離級(jí)別(存在于單獨(dú)的進(jìn)程中)的單個(gè)進(jìn)程中運(yùn)行

6、幾個(gè)應(yīng)用程序域,而不會(huì)造成進(jìn)程間調(diào)用或進(jìn)程間切換等方面的額外開(kāi)銷。在一個(gè)進(jìn)程內(nèi)運(yùn)行多個(gè)應(yīng)用程序的能力顯著增強(qiáng)了服務(wù)器的可伸縮性。 優(yōu)勢(shì): 在一個(gè)應(yīng)用程序中出現(xiàn)的錯(cuò)誤不會(huì)影響其他應(yīng)用程序。能夠在不停止整個(gè)進(jìn)程的情況下停止單個(gè)應(yīng)用程序。應(yīng)用程序域形成了托管代碼的隔離、卸載和安全邊界。 在任意給定時(shí)間,每一線程都在一個(gè)應(yīng)用程序域中執(zhí)行線程:是Windows任務(wù)調(diào)度的最小單位。線程是程序中的一個(gè)執(zhí)行流,每個(gè)線程都有自己的專有寄存器(棧指針、程序計(jì)數(shù)器等),但代碼區(qū)是共享的,即不同的線程可以執(zhí)行同樣的函數(shù)。 解決問(wèn)題:進(jìn)程是一個(gè)資源的擁有者,因而在進(jìn)程的創(chuàng)建、撤銷、和切換的過(guò)程中,系統(tǒng)必須為之付出較大的

7、時(shí)空開(kāi)銷,限制了并發(fā)程度的進(jìn)一步提高。操作應(yīng)用程序域、進(jìn)程實(shí)例演示打開(kāi)iexplore.exe進(jìn)程,并順便打開(kāi)地址: 演示打開(kāi)Notepad.exe演示創(chuàng)建一個(gè)應(yīng)用程序域進(jìn)程、應(yīng)用程序域、線程之間關(guān)系為什么要用多線程讓計(jì)算機(jī)同時(shí)做多件事情,節(jié)約時(shí)間。多線程可以讓一個(gè)程序“同時(shí)”處理多個(gè)事情。后臺(tái)運(yùn)行程序,提高程序的運(yùn)行效率,也不會(huì)使主界面出現(xiàn)無(wú)響應(yīng)的情況。Demo1:單線程帶來(lái)的問(wèn)題.net中如何實(shí)現(xiàn)多線程2(線程同步)產(chǎn)生一個(gè)線程的4步驟:編寫(xiě)產(chǎn)生線程所要執(zhí)行的方法引用System.Threading命名空間實(shí)例化Thread類,并傳入一個(gè)指向線程所要運(yùn)行方法的委托。(這時(shí)候這個(gè)線程已經(jīng)產(chǎn)生

8、,但是還沒(méi)有運(yùn)行)調(diào)用Thread實(shí)例的Start方法,標(biāo)記該線程可以被CPU執(zhí)行了,但具體執(zhí)行時(shí)間由CPU決定。Demo2:兩個(gè)線程同時(shí)運(yùn)行(畫(huà)圖)程序 1 程序 2線程 1線程 2線程 3線程 1線程 2線程 3多線程進(jìn)程與線程一個(gè)進(jìn)程至少有一個(gè)線程 同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行 前臺(tái)線程和后臺(tái)線程前臺(tái)線程:只有所有的前臺(tái)線程都關(guān)閉才能完成程序關(guān)閉。后臺(tái)線程:只要所有的前臺(tái)線程結(jié)束,后臺(tái)線程自動(dòng)結(jié)束。.net中如何實(shí)現(xiàn)多線程1線程肯定也是要執(zhí)行一段代碼的。所以要產(chǎn)生一個(gè)線程,必須先為該線程寫(xiě)一個(gè)方法,這個(gè)方法中的代碼就是該線程運(yùn)行所要執(zhí)行的代碼。(找個(gè)人來(lái)做一件事情)線程啟動(dòng)時(shí),

9、通過(guò)委托調(diào)用該方法。(委托的好處)(線程啟動(dòng)時(shí),調(diào)用傳過(guò)來(lái)的委托,委托就會(huì)執(zhí)行相應(yīng)的方法,實(shí)現(xiàn)線程執(zhí)行方法)Thread類的一些重要成員(*)Start()啟動(dòng)線程Abort()終止線程Thread.Sleep(1) 靜態(tài)方法,可以使當(dāng)前線程停止一段時(shí)間運(yùn)行Name線程名Thread.CurrentThread獲得當(dāng)前的線程引用補(bǔ)充和練習(xí)Demo3:線程中如何訪問(wèn)控件Demo4:執(zhí)行帶參數(shù)的方法線程同步new在堆上申請(qǐng)內(nèi)存空間后干了什么Object obj = new Object();/開(kāi)辟內(nèi)存/調(diào)用構(gòu)造函數(shù)/同步塊索引(負(fù)數(shù))Lock(語(yǔ)法糖)Monitor.Enter(Obj)Monit

10、or.Exit(Obj)案例:模擬SqlServer連接池主要理解lock關(guān)鍵字理解生產(chǎn)者消費(fèi)者問(wèn)題步驟:創(chuàng)建數(shù)組MyConnection數(shù)組創(chuàng)建四個(gè)創(chuàng)建MyConnection實(shí)例的線程,并往數(shù)組中添加實(shí)例(生產(chǎn)者)創(chuàng)建十個(gè)獲取MyConnection實(shí)例的線程在使用lock和不使用lock的情況下做一下對(duì)比線程池在程序中,如果某個(gè)創(chuàng)建某種對(duì)象所需要的代價(jià)太高,同時(shí)這個(gè)對(duì)象又可以反復(fù)使用,那么我們往往就會(huì)準(zhǔn)備一個(gè)容器,用來(lái)保存一批這樣的對(duì)象。于是乎,我們想要用這種對(duì)象時(shí),就不需要每次去創(chuàng)建一個(gè),而直接從容器中取出一個(gè)現(xiàn)成的對(duì)象就可以了。由于節(jié)省了創(chuàng)建對(duì)象的開(kāi)銷,程序性能自然就上升了Threa

11、dPool class提供了一個(gè)線程池,該線程池可用于發(fā)送工作項(xiàng)、處理異步 I/O、代表其他線程等待以及處理計(jì)時(shí)器。線程池允許在后臺(tái)運(yùn)行多個(gè)工作,而不需要為每個(gè)任務(wù)頻繁地創(chuàng)建和銷毀單獨(dú)的線程,從而減少了開(kāi)銷。普通的Windows應(yīng)用程序(如控制臺(tái)或WinForm/WPF),會(huì)將其設(shè)置為“處理器數(shù) * 250”。也就是說(shuō),如果您的機(jī)器為2個(gè)2核CPU,那么CLR線程池的容量默認(rèn)上限便是1000,也就是說(shuō),它最多可以管理1000個(gè)線程同時(shí)運(yùn)行執(zhí)行一個(gè)任務(wù)Task解決返回值的問(wèn)題并行計(jì)算*自學(xué)了解Parallel.ForParallel.ForEachParallel.InvokeSOCKET網(wǎng)絡(luò)編

12、程TCP/IP*TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個(gè)工業(yè)標(biāo)準(zhǔn)的協(xié)議集,它是為廣域網(wǎng)(WANs)設(shè)計(jì)的。UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是屬于TCP/IP協(xié)議族中的一種。應(yīng)用層 (Application):應(yīng)用層是個(gè)很廣泛的概念,有一些基本相同的系統(tǒng)級(jí) TCP/IP 應(yīng)用以及應(yīng)用協(xié)議,也有許多的企業(yè)商業(yè)應(yīng)用和互聯(lián)網(wǎng)應(yīng)用。傳輸層 (Transport):傳輸層包括 UDP 和 TCP,UDP 幾乎不對(duì)報(bào)文進(jìn)行檢查,而 TCP 提供傳輸保證

13、。網(wǎng)絡(luò)層 (Network):網(wǎng)絡(luò)層協(xié)議由一系列協(xié)議組成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。鏈路層 (Link):又稱為物理數(shù)據(jù)網(wǎng)絡(luò)接口層,負(fù)責(zé)報(bào)文傳輸。四層協(xié)議舉例兩個(gè)人在兩個(gè)房子里打電話的圖人通過(guò)【電話】可以通信程序通過(guò)【Socket】來(lái)通信。*套接字 就是 程序間的 電話機(jī)。Socket相關(guān)概念socket的英文原義是“孔”或“插座”。作為進(jìn)程通信機(jī)制,取后一種意思。通常也稱作“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。(其實(shí)就是兩個(gè)程序通信用的。)socket非常類似于電話插座。以一個(gè)電話網(wǎng)為例。電話的通話雙方相當(dāng)于相互通信的2個(gè)程序,電話

14、號(hào)碼就是IP地址。任何用戶在通話之前,首先要占有一部電話機(jī),相當(dāng)于申請(qǐng)一個(gè)socket;同時(shí)要知道對(duì)方的號(hào)碼,相當(dāng)于對(duì)方有一個(gè)固定的socket。然后向?qū)Ψ綋芴?hào)呼叫,相當(dāng)于發(fā)出連接請(qǐng)求。對(duì)方假如在場(chǎng)并空閑,拿起電話話筒,雙方就可以正式通話,相當(dāng)于連接成功。雙方通話的過(guò)程,是一方向電話機(jī)發(fā)出信號(hào)和對(duì)方從電話機(jī)接收信號(hào)的過(guò)程,相當(dāng)于向socket發(fā)送數(shù)據(jù)和從socket接收數(shù)據(jù)。通話結(jié)束后,一方掛起電話機(jī)相當(dāng)于關(guān)閉socket,撤消連接。端口的分類端口分為以下三類:(1)公認(rèn)端口(Well Known Ports):從0到1023,它們緊密綁定(binding)于一些服務(wù)。通常這些端口的通訊 明確

15、表明了某種服務(wù)的協(xié)議。例如:80端口實(shí)際上總是HTTP通訊。(2)注冊(cè)端口(Registered Ports):從1024到49151。它們松散地綁定于一些服務(wù)。也就是說(shuō)有許多服務(wù)綁定于 這些端口,這些端口同樣用于許多其它目的。例如:許多系統(tǒng)處理動(dòng)態(tài)端口從1024左右開(kāi)始。(3)動(dòng)態(tài)和/或私有端口(Dynamic and/or Private Ports):從49152到65535。理論上,不應(yīng)為服務(wù)分配這些端 口。實(shí)際上,機(jī)器通常從1024起分配動(dòng)態(tài)端口。但也有例外:SUN的RPC端口從32768開(kāi)始。Socket相關(guān)概念端口在Internet上有很多這樣的主機(jī),這些主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟

16、件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)(應(yīng)用程序)。例如:http 使用80端口。 ftp使用21端口。 smtp 25端口。23端口主要用于Telnet(遠(yuǎn)程登錄)53端口為DNS(Domain Name Server,域名服務(wù)器。有兩種類型:流式Socket(STREAM):是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用,安全,但是效率低;數(shù)據(jù)報(bào)式Socket(DATAGRAM):是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發(fā)),但效率高.Socket

17、一般應(yīng)用模式(服務(wù)器端和客戶端)1.服務(wù)端 ing socket 開(kāi)始監(jiān)聽(tīng)端口(負(fù)責(zé)監(jiān)聽(tīng)客戶端連接信息)2.客戶端client socket連接服務(wù)端指定端口(負(fù)責(zé)接收和發(fā)送服務(wù)端消息)3.服務(wù)端 ing socket 監(jiān)聽(tīng)到客戶端連接,創(chuàng)建connection socket。(負(fù)責(zé)和客戶端通信)1.2.3.負(fù)責(zé)監(jiān)聽(tīng)連接請(qǐng)求的套接字客戶端套接字負(fù)責(zé)和客戶端通信的套接字Socket一般應(yīng)用模式(服務(wù)器端和客戶端)服務(wù)器端的Socket(至少需要兩個(gè))一個(gè)負(fù)責(zé)接收客戶端連接請(qǐng)求(但不負(fù)責(zé)與客戶端通信)每成功接收到一個(gè)客戶端的連接便在服務(wù)端產(chǎn)生一個(gè)對(duì)應(yīng)的負(fù)責(zé)通信的Socket在接收到客戶端連接時(shí)創(chuàng)建

18、.為每個(gè)連接成功的客戶端請(qǐng)求在服務(wù)端都創(chuàng)建一個(gè)對(duì)應(yīng)的Socket(負(fù)責(zé)和客戶端通信).客戶端的Socket客戶端Socket必須指定要連接的服務(wù)端地址和端口。通過(guò)創(chuàng)建一個(gè)Socket對(duì)象來(lái)初始化一個(gè)到服務(wù)器端的TCP連接。 Socket的通訊過(guò)程服務(wù)器端:申請(qǐng)一個(gè)socket 綁定到一個(gè)IP地址和一個(gè)端口上開(kāi)啟偵聽(tīng),等待接授連接客戶端:申請(qǐng)一個(gè)socket連接服務(wù)器(指明IP地址和端口號(hào))服務(wù)器端接到連接請(qǐng)求后,產(chǎn)生一個(gè)新的socket(端口大于1024)與客戶端建立連接并進(jìn)行通訊,原監(jiān)聽(tīng)socket繼續(xù)監(jiān)聽(tīng)。連接通過(guò)構(gòu)造函數(shù)完成。 public Socket(AddressFamily ad

19、dressFamily, SocketType socketType, ProtocolType protocolType)AddressFamily成員指定Socket用來(lái)解析地址的尋址方案。例如,InterNetwork指示當(dāng)Socket 使用一個(gè) IP 版本 4 地址連接。 SocketType 定義要打開(kāi)的Socket的類型 Socket類使用ProtocolType枚舉向 Windows Sockets API 通知所請(qǐng)求的協(xié)議Socket的構(gòu)造函數(shù) 如:mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stre

20、am, ProtocolType.Tcp);Demo1:監(jiān)聽(tīng)注意:至少要定義一個(gè)要連接的遠(yuǎn)程主機(jī)的IP和端口號(hào)。IP端口是一個(gè)邏輯端口,它的存在是為了讓服務(wù)器上寄宿多個(gè)網(wǎng)絡(luò)應(yīng)用同時(shí)進(jìn)行通信。一個(gè)IP地址的端口 可以有65536(即:216)個(gè)之多.端口號(hào)必須在 1 和 65535之間,最好在1024以后。要連接的遠(yuǎn)程主機(jī)必須正在監(jiān)聽(tīng)指定端口,也就是說(shuō)你無(wú)法隨意連接遠(yuǎn)程主機(jī)。如:IPAddress addr = IPAddress.Parse();IPEndPoint endp = new IPEndPoint(addr, 10001);服務(wù)端先綁定: eSocket.Bind(endp)客戶端再連接:clientSocket.Connect(endp)注意:一個(gè)Socket一次只能連接一臺(tái)主機(jī)。Socket關(guān)閉后無(wú)法再次使用。每個(gè)Socket對(duì)象只能一臺(tái)遠(yuǎn)程主機(jī)連接. 如果你想連接到多臺(tái)遠(yuǎn)程主機(jī), 你必須創(chuàng)建多個(gè)Socket對(duì)象。-相關(guān)類-IPAddress類:包含了一個(gè)IP地址IPEndP

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論