天天看點

C#網絡程式設計_課後習題答案

C#網絡程式設計_課後習題答案

一、說明

此為《C#網絡應用程式設計》第三版 馬駿 部分課後習題答案。

二、目錄

  • 第一章-網絡應用程式設計入門知識
  • 第三章-程序、線程與應用程式域
  • 第四章-資料流與資料的加密和解密
  • 第五章-異步程式設計
  • 第六章-并行程式設計
  • 第七章-WCF入門
  • 第八章-WCF和HTTP程式設計
  • 第九章-WCF和TCP程式設計
  • 第十章-WCF和UDP程式設計

第一章-網絡應用程式設計入門知識

1. 簡述分散式、集中式和分布式通信模型的特點。

  • 分散式:各自獨立的計算機系統之間沒有資源或資訊的交換或共享,存在大量的資料備援及資料不一緻性,維護成本高
  • 集中式:資料的存儲和處理都在單個計算機系統上,使用者終端隻有顯示器和鍵盤。優點是硬體成本低,無資料備援和資料不一緻性。缺點是可靠性低,通路速度受同時使用的使用者數量影響,且無法滿足特殊部門的資料要求
  • 分布式:分散式和集中式的混合體,把分散的資源以一個整體的形式呈現給使用者。資料備援低,通路速度快。
  • 分散式:各自獨立的系統之間沒有資源或資訊的交換或共享。存在大量資料備援且維護成本高,已被淘汰。
  • 集中式:資料和管理功能都集中在單台計算機上,使用者僅能通過終端來操作。優點是硬體成本低、無備援和不一緻性問題,缺點是可靠性和靈活性低,反應慢。
  • 分布式:是分散式系統和集中式系統的混合體,是目前比較完善的解決方案。

2. 簡述C/S和B/S的優缺點。

  • C/S結構的開發和維護成本比B/S高:采用C/S時對于不同用戶端要開發不同的程式,且軟體的安裝、調試和更新都需要在所有客戶機上進行。
  • C/S的用戶端不僅負責與使用者互動,收集使用者資訊,而且還需要完成通過網絡向伺服器請求對資料庫、電子表格或文檔等資訊的處理工作,而B/S的用戶端把事物處理邏輯部分交給伺服器而用戶端隻需顯示

    C/S相對于B/S安全性更高,C/S可以通過嚴格的管理派發軟體,達到保證系統安全的目的。

  • C/S是一種胖用戶端應用程式程式設計架構,其主要工作都在用戶端運作。優點是可以充分利用本地計算機的性能優勢,缺點是需要在本機安裝用戶端軟體。
  • B/S使用HTTP進行通信。優點是單台計算機可以通路任何Web伺服器,缺點是B/S模式有沙盒限制。

3. 什麼是套接字?套接字有哪幾種類型?

  • 套接字是一種通信機制,通信兩方的一種約定,用套接字中的相關函數來完成通信過程。

    類型:流套接字,資料報套接字,原始套接字。

  • 套接字是支援TCP/IP網絡通信的基本操作單元,是不同主機間的程序進行通信的端點。在一個套接字執行個體中,既儲存了本機的IP位址和端口,也儲存了對方的IP位址和端口,同時也儲存了雙方通信采用的網絡協定等資訊。

第三章-程序、線程與應用程式域

1. 簡要回答下列問題。

(1)程序和線程有什麼差別?為什麼要用多線程?多線程适用于哪種場合?

(2)前台線程和背景線程有什麼差別和聯系?如何判斷一個線程屬于前台線程還是背景線程?如何将一個線程設定為背景線程?

(1)程序是正在執行的程式,線程是某個程序中的一個或多個執行流。多線程可讓多個任務同時執行。當執行需要較長時間才能完成的連續操作時,或者等待網絡或其他I/O裝置相應時,都可以使用多線程技術。

(2)一個線程要麼是前台線程要麼是背景線程。兩者的差別是:背景線程不會影響程序的終止,而前台線程則會影響程序的終止。

  • 線程是程序的組成部分,一個程序包含多可線程,一個線程必須擁有一個父線程
  • 線程之間可以共享記憶體資料,程序之間不能共享記憶體資料.
  • 多線程可以提高資源利用效率,提高吞吐量.防止阻塞主線程.
  • 比方說多步驟任務處理,分割成多個線程去處理

2.什麼是同步?為什麼需要同步?C#提供了什麼語句可以簡單地實作代碼同步?

  • 執行某語句時,在該語句完成之前不會執行其後面的代碼,這種執行方式稱為同步執行。當并行執行的多個線程同時通路某些資源時,必須考慮如何讓多個線程保持同步。同步的目的是為了防止多個線程同時通路某些資源時出現死鎖和争用情況。C#提供的lock語句可以簡單地實作代碼同步。
  • 同步是指在某一時刻隻有一個線程可以通路變量
  • 同步方法調用在程式繼續執行之前需要等待同步方法執行完畢傳回結果
  • 異步方法則在被調用之後立即傳回以便程式在被調用方法完成其任務的同時執行其它操作。
  • 同步阻塞線程,異步不阻塞
  • 委托的Invoke方法用來進行同步調用
  • 委托的異步調用通過BeginInvoke和EndInvoke來實作。
  • 異步模型的優勢在如下情況下會得到發揮:
  1. 有大量的任務,以至于可以認為在一個時刻至少有一個任務要運作
  2. 任務執行大量的I/O操作,這樣同步模型就會在因為任務阻塞而浪費大量的時間
  3. 任務之間互相獨立,以至于任務内部的互動很少。

3.什麼是線程池?使用線程池有什麼好處?

  • 線程池是在背景執行任務的線程集合,好處有:如當某個線程無法進入線程池執行時先将其放入等待隊列,自動決定用哪個處理器執行線程池中的某個線程,自動調節這些線程執行時的負載平衡問題等。另外,線程池總是在背景異步處理請求的任務,而不會占用主線程,也不會延遲主線程中後續請求的處理。
  • 線程池統一建立出一批線程,放在一個用以的地方,當使用線程的時候直接來這個地方取,用完再放回去。這個地方指的就是線程池。使用線程池的好處就是不需要頻繁的建立和銷毀線程,加快了程式的性能

第四章-資料流與資料的加密和解密

1. 什麼是編碼?什麼是解碼?為什麼要對字元進行編碼和解碼?.NET架構提供了哪些用于字元編碼和解碼的類?

  • 将字元序列轉換為位元組序列的過程稱為編碼;當這些位元組傳送到網絡的接收方時,接收方再将位元組序列轉換為字元序列,這種過程稱為解碼。
  • 在網絡通信中,很多情況下通信雙方傳達的都是字元資訊。但是,字元資訊并不能直接從網絡的一端傳遞到另一端,這些字元資訊首先需要被轉換成一個位元組序列,然後才能在網絡中傳輸。是以,發送方需要進行編碼,相應的接收方就要執行解碼。
  • .NET架構中一般常用Encoding類實作編碼和解碼。Encoding類位于System.Text命名空間下,該類主要用于對字元集進行編碼和解碼以及将一種編碼格式轉換為另一種編碼格式。如果有更詳細的需求可以還使用與Encoding類位于同一命名空間下的Encoder和Decoder類來進行編碼和解碼。

2. .NET提供的從Stream類繼承的資料流都有哪些?

  • 檔案流(FileStream)、記憶體流(MemoryStream)、網絡流(NetworkStream)加密流(CryptoStream)。

第五章-異步程式設計

1. 僅包含async和await關鍵字的異步方法與用Task.Run調用的異步方法有和不同?

async和await關鍵字是C# 5.0提供的功能,僅包含async和await關鍵字的異步方法不會建立新線程,它隻是表示在目前線程中異步執行指定的任務。而Task.Run方法是.NET架構4.5提供的功能,它會線上程池中用單獨的線程執行某個任務。

2. 把普通方法和異步方法作為任務來執行時,調用方法有何不同?

普通方法要用Task.Run方法去調用,或者用Task、Task類的構造函數顯示建立Task執行個體,然後再啟動。異步方法不需要用Task.Run方法去調用。

3. Action和Func委托有什麼不同?

Action委托封裝了不帶傳回值的方法(有0~16個輸入參數,傳回類型為void),Func委托封裝了帶傳回值的方法(有0~16個輸入參數,傳回類型為TResult)。

4.有幾種建立任務的方式?

有4種方式。

(1)利用Task.Run方法隐式建立和執行任務;

(2)利用async和await關鍵字隐式建立異步任務;

(3)利用WPF控件的排程器隐式建立和執行任務;

(4)通過顯式調用Task或Task的構造函數建立任務。

第六章-并行程式設計

1.TPL支援哪些并行方式?

  • TPL支援資料并行,任務并行和并行查詢(PLINQ)。

3.簡述Parallel幫助器類有哪些?功能分别是什麼?

  • 幫助器類包括ParallelOptions、ParallelLoopState、ParallelLoopResult、CancellationToken和CancellationTokenSource。

    ParallelOptions類用于為Parallel類的方法提供操作選項,常用屬性有:CancellationToken、MaxDegreeOfParallelism、TaskScheduler。

    ParallelLoopState類用于将Parallel循環的疊代與其他疊代互動。常用屬性和方法有:IsExceptional屬性、IsStopped屬性、Break方法、Stop方法。

  • ParallelLoopResult類用于提供Parallel循環的完成狀态,常用屬性有:IsCompleted、LowestBreakIteration。
  • CancellationTokenSource用于建立取消通知,稱為取消源。
  • CancellationToken結構用于傳播應取消操作的通知,稱為取消令牌。

4. 使用Parallel.Invoke方法時,為了能讓Action與WPF界面互動,要注意什麼問題?

  • 不能使用預設的任務排程程式,而是通過設定并行選項,将任務排程程式與WPF目前同步上下文關聯起來,相關代碼如下。

    ParallelOptions options = new ParallelOptions();

    options.TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();

第七章-WCF入門

2.簡要介紹WCF服務的承載方式及其特點。

WCF服務的承載方式包括:利用IIS或者WAS承載、利用Windows服務承載、自承載。其特點如下。

(1) 用IIS或者WAS承載:這是最常用的一種承載方式,特點是部署簡單,友善。

(2) 用Windows服務承載:用【WCF服務庫】模闆建立的WCF服務利用Windows程序去承載。

(3) 自承載:指開發人員自己編寫代碼實作承載WCF的工作。優點是實作靈活,需要的環境支援最小。缺點是進階宿主管理功能需要自己寫代碼去實作。

3.什麼是服務協定,什麼是資料協定,分别用哪些特性聲明服務協定和資料協定?

服務協定是指WCF對用戶端公開哪些服務。WCF服務端通過服務協定向用戶端公開以下内容:操作方法、消息交換模式、采用的通信協定以及序列化格式。服務協定用ServiceContract特性和OperationContract特性來共同聲明。

資料協定描述的是消息中包含哪些資料,即規定哪些資料能夠被序列化為XML傳輸到用戶端。資料協定用DataContract特性和DataMember特性來共同聲明。

第八章-WCF和HTTP程式設計

1.編寫基于C/S的HTTP應用程式時,有哪幾種實作技術?各自的特點是什麼?

(1).用可插接式協定實作

可插接式協定用WebRequest類和WebResponse類來實作。這兩個類是各種與具體的通信協定相關的類的基類,提供了上傳、下載下傳等基本方法。或者說,不論采用的是哪種通信協定,都可以用這兩個對來實作。

(2).用HttpWebRequest和HttpWebResponse實作

HttpWebRequest類和HttpWebResponse類是針對HTTP而提供的,分别從WebRequest類和WebResponse類繼承而來。

(3).用WCF實作

用WCF和基于任務的程式設計模型實作HTTP應用程式設計是面向服務程式設計中建議的做法。

  • 前兩種方式都是傳統的程式設計模型,在實際項目中,如果用傳統的程式設計模型來實作,除了業務處理之外,很多細節也都需要程式員自己去完成,例如負載平衡、網絡監視、安全管理、防範攻擊等。而用WCF來實作,程式員隻需要處理業務邏輯即可,其他工作讓WCF内部去完成就行了。

2.WCF用戶端和服務端的消息交換模式有哪些?

  • 請求/應答模式、單向模式、雙工模式。

第九章-WCF和TCP程式設計

1.TCP有哪些主要特點?

(1) 一對一通信。一旦通信雙方建立了TCP連接配接,連接配接中的任何一方都能向對方發送資料和接收對方發送來的資料。每個TCP連接配接隻能有兩個端點,而且隻能一對一通信。

(2) 安全順序傳輸。通過TCP連接配接傳送的資料,能保證資料無差錯、不丢失、不重複地準确到達接收方,并且保證各資料到達的順序與資料發出的順序相同。

(3) 通過位元組流發送資料。利用TCP傳輸資料時,資料以位元組流的形式進行傳輸。

(4)傳輸的資料無消息邊界。

2.解決TCP的無消息邊界問題有哪些常用的辦法?

(1)發送固定長度的消息。

(2)将消息長度與消息一起發送。

(3)使用特殊标記分隔消息。

3.簡述基于任務的異步TCP程式設計和直接用Thread實作的主要差別。

  • 直接用Thread來實作TCP程式設計時,是以多線程為目标來實作的,需要開發人員自己管理多線程,是以開發人員必須熟練掌握多線程實作的所有細節,才能編寫出實際的TCP應用程式。而基于任務的異步TCP程式設計是通過任務來實作TCP程式設計,用多任務實作時,即使開發人員對多線程、線程池以及資源沖突和負載平衡等所有技術實作細節不太熟悉,一樣可以快速編寫出實際的TCP應用程式,而且程式的健壯性比直接用多線程來實作要高得多。

5. 簡要回答用WCF編寫TCP伺服器端和用戶端程式的一般步驟。

  • 使用WCF編寫TCP伺服器端應用程式的一般步驟如下。

    1)建立一個WPF應用程式,在項目中添加WCF服務。

    2)在WCF服務接口檔案中定義服務端與用戶端通信的協定,并實作定義在服務端需要實作的協定方法。

    3)修改服務端配置檔案,并啟動WCF服務,等待用戶端調用并與用戶端通信。

    4)根據實際情況确定是否關閉WCF服務。

  • 使用WCF編寫TCP用戶端端應用程式的一般步驟如下。

    1)建立一個WPF應用程式,添加服務引用。

    2)實作WCF服務定義在用戶端需要實作的協定方法。

    3)調用WCF服務,與服務端進行通信。

第十章-WCF和UDP程式設計

1. UDP和TCP的主要差別有哪些?

UDP是簡單的、面向資料報的無連接配接協定,提供了快速但不一定可靠的傳輸服務。與TCP一樣,UDP也是建構于底層IP協定之上的傳輸層協定。與TCP相比,UDP具有以下特點。

(1)UDP不但支援一對一通信,而且支援一對多通信。

(2)UDP傳輸速度比TCP快。

(3)UDP有消息邊界,使用UDP不需要考慮消息邊界問題。

(4)UDP不確定資料的發送順序和接收順序一緻。

(5)UDP可靠性不如TCP。

2. 什麼是廣播?什麼是多路廣播?兩者有什麼差別?

  • 廣播是指同時向多個裝置發送消息,并且所有子網中的裝置都可以接收到發送方發來的消息。每個廣播消息包含一個特殊的IP位址。廣播消息位址分為兩種類型:本地廣播和全球廣播。本地廣播可以向子網中的所有裝置發送廣播消息,其他網絡不會受到本地廣播的影響。
  • 多路廣播是将消息從一台裝置發送到本網或全網内選擇的裝置子集上,即發送到那些加入指定多點傳播組的裝置上。
  • 二者差別:廣播隻能向其所在的子網内發送消息,而且是向子網中的所有裝置發送消息,沒有目的性,不但造成了網絡負載,而且資源消耗較高。而多路廣播是将消息發送到加入到特定多點傳播組内的機器上,消息有目的性,資源消耗不高。

3. 簡要回答利用UdpClient對象加入和退出多點傳播組的步驟。

  • 在UDP協定中,廣播群組播的實作都是借助于特殊的IP位址實作的。特别是多點傳播比較特殊。對于IPv4來說,多點傳播是指在224.0.0.0到239.255.255.255的D類IP位址範圍内進行廣播。
  • 加入多點傳播組時,首選建立UdpClient對象,然後使用JoinMutiCastGroup方法加入多點傳播組。當退出多點傳播組時,使用UdpClient對象的DropMulticastGroup方法可以退出多點傳播組,參數中指出要退出多點傳播組的IPAddress對象。

4. 簡要回答用WCF和UDP編寫多點傳播程式與用UdpClient類編寫多點傳播程式有哪些主要的不同點?這兩種實作方式中,各自的優缺點有哪些?

  • 使用UDP編寫多點傳播程式時,均需要将消息發送到特殊的IP位址。使用UdpClient類編寫多點傳播程式時,需要先加入到特定的多點傳播組,然後才能接收來自多點傳播發送端發送的資料。具體實作時主要是利用UdpClient類的JoinMutiCastGroup方法加入多點傳播組,發送端利用UdpClient對象的Send方法發送資料到多點傳播位址,接收端利用UdpClient對象的Receive方法接收資料。若要退出多點傳播組調用DropMulticastGroup方法即可。
  • 使用WCF和UDP編寫多點傳播程式時,需要使用WCF服務定義和實作通信的協定,然後向多點傳播位址發送消息,這樣凡是實作WCF服務定義和實作通信協定的用戶端均可以接收到消息。
  • 使用UdpClient類實作時,主要借助多線程和多任務來實作,易于了解,但是需要考慮較多的實作細節。而WCF模式對UDP多點傳播程式設計進行了進一步的封裝,降低了程式設計的複雜度,更适合分布式環境下的UDP通信程式。