1 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議.ppt_第1頁
1 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議.ppt_第2頁
1 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議.ppt_第3頁
1 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議.ppt_第4頁
1 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議.ppt_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,網(wǎng)絡(luò)高級編程,通信與信息工程系 陳湘國 2009年春,2,第1章 進(jìn)程、線程與網(wǎng)絡(luò)協(xié)議,1.1 進(jìn)程和線程 1.2 IP地址與端口 1.3 套接字 1.4 網(wǎng)絡(luò)流,3,1.1 進(jìn)程和線程,程序:是一段靜態(tài)的代碼,是應(yīng)用軟件執(zhí)行的藍(lán)本。 進(jìn)程(Process) :是應(yīng)用程序的一個運(yùn)行實(shí)例,是應(yīng)用程序的一次動態(tài)執(zhí)行過程。 與進(jìn)程相關(guān)的信息包括:進(jìn)程的用戶標(biāo)志、正在執(zhí)行的已經(jīng)編譯好的程序、進(jìn)程程序和數(shù)據(jù)在存儲器中的位置等。 操作系統(tǒng)可以同時運(yùn)行多個應(yīng)用程序,對應(yīng)多個進(jìn)程,可通過任務(wù)管理器查看當(dāng)前系統(tǒng)運(yùn)行的進(jìn)程。,4,線程(Thread):是進(jìn)程中的一個執(zhí)行單元。一個進(jìn)程可以包含若干個線程。 一個

2、程序可以同時完成多個方面的任務(wù),例如: HTTP服務(wù)器,一邊不斷地監(jiān)聽本地的熟知端口80,一邊要處理多個用戶的服務(wù)請求。 使用QQ程序可以同時與多個好友聊天。 這些都被稱為并發(fā)處理。,1.1 進(jìn)程和線程,5,1.1 進(jìn)程和線程(續(xù)),并發(fā)處理: 線程是CPU調(diào)度和分配的基本單位。 在一個單處理器系統(tǒng)中可以通過分時處理來獲得并發(fā),系統(tǒng)為每個線程分配一定的CPU時間片,每個線程只有在分配的時間片內(nèi)才擁有對CPU的控制權(quán),其它時間都在等待。,6,1.1.1 Process類,Process類:位于System. Diagnostics(診斷)命名空間下,它專門用于完成系統(tǒng)進(jìn)程的管理任務(wù)。 可以在本地

3、計算機(jī)上啟動和停止進(jìn)程,也可以向進(jìn)程查詢特定類型的信息。 在遠(yuǎn)程計算機(jī)上,無法啟動和停止進(jìn)程,但可以查詢進(jìn)程的相關(guān)信息。 在對進(jìn)程進(jìn)行操作時,一般先創(chuàng)建Process類的實(shí)例,然后設(shè)置其對象成員的StartInfo屬性,最后調(diào)用它的Start方法。,7,例1 啟動、停止和觀察進(jìn)程,要操縱進(jìn)程,必須導(dǎo)入NameSpace: using System.Diagnostics; 1. 啟動進(jìn)程(1) /申明并實(shí)例化一個進(jìn)程 Process myprocess=new Process(); /設(shè)置進(jìn)程的啟動信息 myprocess.StartInfo.FileName = notepad.exe; /

4、啟動進(jìn)程 myprocess.Start();,8,例1 啟動、停止和觀察進(jìn)程,1. 啟動進(jìn)程(2) /申明并實(shí)例化一個進(jìn)程 Process myProcess = new Process(); /設(shè)置進(jìn)程的啟動信息 myProcess.StartInfo.FileName = “D:MyFile.doc; myProcess.StartInfo.Verb = Print; myProcess.StartInfo.CreateNoWindow = true; /啟動進(jìn)程 myProcess.Start();,9,例1 啟動、停止和觀察進(jìn)程,1. 啟動進(jìn)程(3) /也可以使用Process類本身

5、(而不是Process類的實(shí)例)的Start方法啟動進(jìn)程,.NET提供了該方法的多種重載,例如: Process.Start(IExplore.exe, textBox1.Text); 2. 終止進(jìn)程 可以使用Close方法結(jié)束進(jìn)程,并釋放與它關(guān)聯(lián)的所有資源。 也可以先使用WaitForExit阻止線程繼續(xù)執(zhí)行,然后使用CloseMainWindow向進(jìn)程的主窗口發(fā)送關(guān)閉消息來關(guān)閉擁有用戶界面的進(jìn)程。,10,2、終止進(jìn)程 private void buttonStop_Click(object sender, EventArgs e) /創(chuàng)建新的Process組件的數(shù)組,并將它們與指定的進(jìn)程名

6、稱(Notepad)的所有進(jìn)程資源相關(guān)聯(lián) Process myprocesses; myprocesses = Process.GetProcessesByName(Notepad); foreach (Process instance in myprocesses) /設(shè)置終止當(dāng)前線程前等待1000毫秒 instance.WaitForExit(1000); instance.CloseMainWindow(); ,11,3、觀察進(jìn)程 可以使用Process類本身的GetProcesses方法獲得系統(tǒng)啟動的所有進(jìn)程(為每個進(jìn)程資源創(chuàng)建一個Process組件),并可通過訪問它們的屬性(如Id,

7、ProcessName,StartTime等)了解進(jìn)程的相關(guān)信息。 Process myprocesses = Process.GetProcesses(); label2.Text = string.Format(當(dāng)前進(jìn)程數(shù):0, myprocesses.Length); foreach (Process p in myprocesses) /循環(huán); /由于訪問Idle的StartTime會出現(xiàn)異常,所以將其排除在外 if (p.ProcessName != Idle) listBox1.Items.Add(string.Format(0,-5|1,-25|2:HH:m:s, p.Id, p

8、.ProcessName, p.StartTime); ,12,1.1.2 線程Thread類,Thread類:在System.Threading名稱空間下, Thread類是用于創(chuàng)建和控制線程的,對線程的常用操作有:啟動線程、終止線程、合并線程和讓線程休眠等。,13,1.1.2 Thread類,1、啟動線程 在使用線程前,首先要創(chuàng)建一個線程,如: Thread t=new Thread(enterPoint); 其中enterPoint為線程的入口,即線程開始執(zhí)行的方法。在托管代碼中,是通過委托處理線程執(zhí)行的代碼的。如: Thread t=new Thread(new ThreadStart

9、(methodName); 創(chuàng)建線程實(shí)例后,可調(diào)用Start方法啟動線程。 t.Start();,14,1.1.2 Thread類,2、終止線程 不需要繼續(xù)執(zhí)行某個線程時,可調(diào)用Thread類的Abort方法終止該線程,例如:t.Abort(); Abort方法沒有參數(shù)。當(dāng)調(diào)用Abort方法時,CLR可能不會立即終止線程。 主線程調(diào)用子線程的Abort方法后,結(jié)束子線程會占用大量CPU的時間,表面上看就像死機(jī)。為解決這個問題,可以在主線程中調(diào)用子線程對象的Join方法,并在Join方法中指定主線程等待子線程結(jié)束的等待時間。,15,1.1.2 Thread類,3、合并線程 Join方法用于把兩個

10、并行執(zhí)行的線程合并為一個單個的線程。如果一個線程t1在執(zhí)行的過程中需要等待另一個線程t2結(jié)束后才繼續(xù)執(zhí)行,可以在t1中調(diào)用t2的join()方法。 如: t2.Join(); 這樣t1在執(zhí)行到t2.join()語句就會處于阻塞狀態(tài),直到t2結(jié)束后才會繼續(xù)執(zhí)行。為了解決t2一直不結(jié)束的問題,可以在調(diào)用t2的Join方法的時候指定一個等待時間。 如: t2.Join(100); Join方法通常和Abort一起使用。,16,1.1.2 Thread類,4、讓線程休眠 在多線程應(yīng)用程序中,有時候并不希望某一個線程繼續(xù)執(zhí)行,而是希望該線程停止一段時間,等待其它線程執(zhí)行之后再接著執(zhí)行。這時可以調(diào)用Thr

11、ead類的Sleep方法,即讓線程休眠。 例如:Thread.Sleep(1000); /讓當(dāng)前線程休眠1000毫秒 注意,調(diào)用Sleep方法的是類本身,而不是類的實(shí)例。休眠的是該語句所在的線程,而不是其他線程。,17,1.1.2 Thread類,5、線程優(yōu)先級 在C#應(yīng)用程序中,可以對線程設(shè)定五個不同的優(yōu)先級,由高到低分別是Highest、AboveNormal、 Normal、 BelowNormal和Lowest。在創(chuàng)建線程時如果不指定其優(yōu)先級,則系統(tǒng)默認(rèn)為Normal。 若想讓一些重要的線程優(yōu)先執(zhí)行,可以使用下面的方法為其賦予較高的優(yōu)先級: Thread t=new Thread(ne

12、w ThreadStart(enterpoint); t.priority=ThreadPriority.AboveNormal; 設(shè)置線程的優(yōu)先級可改變線程的執(zhí)行順序,所設(shè)置的優(yōu)先級僅適用于這些線程所屬的進(jìn)程。當(dāng)把某線程的優(yōu)先級設(shè)置為Highest時,系統(tǒng)正在運(yùn)行的其它線程都會中止。,18,1.1.2 Thread類,6、線程池 線程池是一種多線程處理形式,線程池為線程生命周期的開銷問題和資源不足問題提供了很好的解決方案。通過多個任務(wù)重用線程,線程創(chuàng)建的開銷被分?jǐn)偟搅硕鄠€任務(wù)上。 線程池適用于需要使用多個線程而每個線程實(shí)際執(zhí)行時間較短的場合 。但是如果線程運(yùn)行的時間比較長的話,那么此時線程的

13、運(yùn)行時間比線程的創(chuàng)建時間要長得多,僅靠減少線程的創(chuàng)建時間對系統(tǒng)效率的提高就不是那么明顯了,此時就不適合使用線程池技術(shù) 。,19,1.1.2 Thread類,7、線程同步 在某一時刻只有一個線程可以訪問變量或者對象。 線程t1對variable1操作時,為了避免其他線程也對其進(jìn)行操作,可以使用C#提供的lock語句將variable1鎖定。 實(shí)現(xiàn)代碼為: lock (variable1); variable1+=1; 注意:不要將被同步的對象聲明為public。,20,例2 在程序中使用線程,1. 新建一個名為ThreadExample的Windows應(yīng)用程序 。 2. 向設(shè)計窗體拖放一個Tim

14、er組件。 3. 引用命名空間: using System.Threading; 4. 字段聲明: StringBuilder sb = new StringBuilder(); Thread thread1, thread2; 5. AppendingString方法 private void AppendingString(string str) lock(sb) sb.Append(str); ,6. 兩個線程要執(zhí)行的方法 private void Method1() while (true) Thread.Sleep(500); AppendingString(a); private

15、void Method2() while (true) Thread.Sleep(500); AppendingString(b); ,21,7 啟動和終止線程1 private void button1_Click(object sender, EventArgs e) if (button1.Text = 啟動線程1) thread1 = new Thread(new ThreadStart(Method1); thread1.Start(); button1.Text = 終止線程1; timer1.Enabled = true; else thread1.Abort(); thread

16、1.Join(100); button1.Text = 啟動線程1; ,啟動和終止 線程2類似,22,8. 定時器操作 private void timer1_Tick(object sender, EventArgs e) if (thread1.IsAlive = true | thread2.IsAlive = true) richTextBox1.Text = sb.ToString(); else timer1.Enabled = false; ,23,分析:,主線程:響應(yīng)窗體事件 如:按鈕單擊事件 定時器滴答事件,線程1:休息500毫秒,往字符串中寫一字符“a”,如此重復(fù),線程2:

17、休息500毫秒,往字符串中寫一字符“b”,如此重復(fù),24,思考:,在上面的例子中,子線程1、2分別往(StringBuilder)sb中寫入字符“a”和“b”,然后在定時器的控制下將sb中的字符串寫到文本框(控件)中。,分析:,文本框(控件)是由主線程創(chuàng)建和維護(hù)的。,子線程直接操作控件可能出現(xiàn)問題。,為什么不是子線程直接將字符寫入文本框?,25,1.1.3 一個線程中操作另一個線程的控件,默認(rèn)情況下,為了防止引起死鎖等不安全因素,C#不允許在一個線程中直接操作另一個線程中的控件。 但在Windows應(yīng)用程序中,為了在窗體上顯示子線程的執(zhí)行情況和結(jié)果,經(jīng)常要在子線程中使用主線程的控件。 常用的辦

18、法是使用委托(delegate)來完成這個工作。 子線程委托主線程進(jìn)行控件的操作。 例3. 一個線程操作另一個線程的控件委托調(diào)用,26,例3. 委托調(diào)用,1. 申明委托類型和委托對象 delegate void AppendStringDelegate(string str); AppendStringDelegate AppendString; 2. 定義委托方法 private void AppendStringMethod(string str) richTextBox1.AppendText(str); 3. 實(shí)例化委托對象:實(shí)現(xiàn)委托對象和委托方法的關(guān)聯(lián) AppendString =

19、new AppendStringDelegate(AppendStringMethod);,27,4. 使用委托 private void Method1() while (flag1) Thread.Sleep(500); richTextBox1.Invoke(AppendString,a); private void button1_Click(object sender, EventArgs e) if (button1.Text = 啟動線程1) flag1 = true; thread1 = new Thread(new ThreadStart(Method1); thread1.

20、Start(); button1.Text = 終止線程1; else flag1 = false; button1.Text = 啟動線程1; ,28,1.2 TCP/IP協(xié)議、IP地址與端口,TCP/IP協(xié)議棧中的主要協(xié)議有: 1、應(yīng)用層:HTTP、FTP、SMTP、POP3、DNS、SNMP等 2、傳輸層:TCP、UDP 3、網(wǎng)絡(luò)層:IP、ICMP、RIP、OSPF、BGP IP地址:用于標(biāo)識Internet中主機(jī)和路由器的接口。 特殊IP:網(wǎng)絡(luò)地址、廣播地址、回環(huán)地址。 端口port:傳輸層協(xié)議通過端口為應(yīng)用進(jìn)程提供服務(wù)。 熟知端口:HTTP(80)、FTP(21)、SMTP(25)、

21、DNS(53),29,1.2.1 IPAddress類與Dns類,System.Net 命名空間為當(dāng)前網(wǎng)絡(luò)上使用的多種協(xié)議提供了簡單的編程接口。 IPAddress類提供了對IP地址的轉(zhuǎn)換、處理等功能。 1、Parse方法:將IP地址字符串轉(zhuǎn)換為IPAddress實(shí)例。如: IPAddress ip = IPAddress.Parse(“”); 不能使用IPAddress ip = New IPAddress (“”); 2、Any屬性:表示本地系統(tǒng)可用的任何IP地址; 3、Broadcast屬性:表示本地網(wǎng)絡(luò)的IP廣播地址; 4、Loopback屬

22、性:表示系統(tǒng)的回送地址; 5、None屬性:提供不使用任何網(wǎng)絡(luò)接口的IP地址。,30,1.2.2 IPAddress類與Dns類(續(xù)),Dns類提供了一系列靜態(tài)的方法,用于獲取提供本地或遠(yuǎn)程域名等功能,常用方法有: 1、GetHostAddresses方法 獲取指定主機(jī)的IP地址,返回一個IPAddress類型的數(shù)組。函數(shù)原形為: public static IPAddress GetHostAddresses(string hostNameOrAddress); 例如: IPAddress ip=Dns.GetHostAddresses(); listBox1.Items.AddRange(

23、ip);,31,2、GetHostName方法 用于獲取本機(jī)主機(jī)名。 函數(shù)原形為: public static string GetHostName () 例如: string hostname = Dns.GetHostName();,32,1.2.3 IPHostEntry類,IPHostEntry的實(shí)例對象中包含Internet主機(jī)的相關(guān)信息。 常用屬性有: 1、AddressList屬性:獲取或設(shè)置與主機(jī)關(guān)聯(lián)的IP地址列表。是一個IPAddress類型的數(shù)組,包含指定主機(jī)的所有IP地址; 2、Aliases屬性:獲取或設(shè)置與主機(jī)關(guān)聯(lián)的別名列表。 3、HostName屬性:獲取或設(shè)置主機(jī)

24、的 DNS 名稱。 在Dns類中,有一個專門獲取IPHostEntry對象的方法GetHostEntry,通過返回的IPHostEntry對象,可以獲取本地或遠(yuǎn)程主機(jī)的相關(guān)地址信息。例如:,33,1.2.3 IPHostEntry類,listBox1.Items.Add(搜狐新聞所用的服務(wù)器IP地址有:); IPAddress ip = Dns.GetHostEntry().AddressList; listBox1.Items.AddRange(ip); listBox1.Items.Add(本機(jī)IP地址為:); ip = Dns.GetHostEntry(Dns.GetHostName()

25、.AddressList; listBox1.Items.AddRange(ip);,34,1.2.4 IPEndPoint類,IPEndPoint類包含了應(yīng)用程序連接到網(wǎng)絡(luò)進(jìn)程所需的IP地址和端口號。 IPEndPoint類常用的構(gòu)造函數(shù)為: public IPEndPoint(IPAddress, int); 其中第一個參數(shù)指定IP地址,第二個參數(shù)指定端口號。 例 :IPAddress類、Dns類、IPHostEntry類和IPEndPoint類的使用。,35,1.3.1 套接字概念,A Socket is the interface between the application lay

26、er and the transport layer within a host.,It is also referred to the application programming interface (API) between the application and the network, since the socket is the programming interface with which network applications are built in the Internet.,36,socket analogous to door 1. sending proces

27、s shoves message out door 2. sending process relies on transport infrastructure on other side of door which brings message to socket at receiving process,Internet,controlled by OS,controlled by app developer,API: 應(yīng)用編程接口 (1) choice of transport protocol; (2) ability to fix a few parameters (lots more

28、 on this later),process sends/receives messages to/from its socket,37,1.3.2 套接字分類(1),.NET 中的SocketType 1. Dgram:支持?jǐn)?shù)據(jù)報,即最大長度固定(通常很小)的無連接、不可靠消息。消息可能會丟失或重復(fù)并可能在到達(dá)時不按順序排列。Dgram 類型的 Socket 在發(fā)送和接收數(shù)據(jù)之前不需要任何連接,并且可以與多個對方主機(jī)進(jìn)行通信。Dgram 使用數(shù)據(jù)報協(xié)議 (Udp) 和 InterNetworkAddressFamily。 2. Stream:支持可靠、雙向、基于連接的字節(jié)流,且不重復(fù)數(shù)據(jù),也不保留邊界。此類型的 Socket 與單個對方主機(jī)進(jìn)行通信,并且在通信開始之前需要建立遠(yuǎn)程主機(jī)連接。Stream 使用傳輸控制協(xié)議 (Tcp) 和 InterNetworkAddressFamily。 3. Raw:支持對基礎(chǔ)傳輸協(xié)議的訪問,如ICMP、IGMP等。 此外還有 Rdm、Seqpacket、Unknown。,38,1.3.2 套接字分類(2),按照通信過程中所扮演的角色分為: 1、Server Socket: Passive 2、Client

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論