【.NET】Socket通訊
TCP/IP模型概述
1、OSI參考模型把計算機網路通訊定義為七層框架模型 2、後來出現了TCP/IP模型,分為四個層次 **鏈路層:**網路硬體 網路層: IP層,主要把分組發往目標網路或主機 傳輸層: 提供端到端的資料通訊,它分為兩個不同的協議:TCP和UDP。TCP提供有質量保證的端到端的資料傳輸、負責資料分組、質量控制和超時重發。 UDP則負責簡單地把資料報從一端傳送到另一端。是否到達、是否按時到達、是否損壞必須由應用層來控制 用途:TCP用於面向連線的應用,UDP在及時性服務中有重要用途,如網路多媒體通訊。 應用層: 應用層負責處理實際的應用程式細節,主要包括一些協議。 基於TCP的有FTP、HTTP等,基於UDP的有SNMP。
NET網路程式設計
1、.NET框架為網路開發提供兩個頂層名稱空間:Sysetm.NET、System.Web同時又包含多個子名稱空間。 常用的幾個
名稱空間 | 功能概述 |
---|---|
為當前網路上流行的多種協議提供一個統一、簡單的程式設計介面。WebRequest和WebResponse類 | |
System.Net.Sockets | 為需要嚴格控制網路訪問的開發人員提供Windows套接字介面的託管實現 |
Http輸出(HttpResponse)和讀取HttpRequest,額外的類則提供了一些功能,用於伺服器端的實用程式以及程序、cookie管理、檔案傳輸、異常資訊和輸出快取控制 | |
System.Web.Services | 包含能夠生成和使用XML Web service的類,這些服務是駐留在Web伺服器中的可程式設計實體,並通過標準Internet協議公開 |
System.Net.Sockets名稱空間主要類組成及功能 NetworkStream:為網路訪問提供了基礎資料流 Socket:實現了Berkeley套接字介面 TCPClient:為TCP網路服務提供了客戶連線 TCPListener:用以監聽TCP客戶連線 UDPClient:用於提供UDP網路服務 System.Web名稱空間的主要類組成及功能 HttpApplication:定義ASP.NET應用程式中所有應用程式物件的通用方法、屬性和事件。 HttpApplicationState、HttpBrowserCapabilities HttpContext:封裝了所有關於HTTP請求的特定資訊 HttpException:提供了生成HTTP異常的手段 HttpRequest:允許ASP.NET讀取在Web請求中由客戶發出的HTTP值 HTTPResponse:封裝了來自一個ASP.NET操作的HTTP響應資訊 HTTPUtility:為處理Web請求時的URL編碼和解碼提供了方法
套接字程式設計
Socket套接字是基於TCP協議上的一個抽象層。 服務端在一個總所周知的地址監聽對服務的請求。也就是說,服務程序一直處於休眠狀態,直到一個客戶對這個服務的地址監聽對服務的請求。也就是說,服務程序一直處於休眠狀態,直到一個客戶對這個服務的地址提出了連線請求。這個時刻,服務程式被“喚醒”並且為客戶提供服務。伺服器端程式執行如下: 1、開啟一個通訊通道並告知本地主機,它願意在某一地址和埠上接收客戶請求。 2、等待客戶請求到達該埠。 3、接收到重複服務請求,處理該請求併發送應答訊號。接收到併發服務請求,啟用一個新的程序(或執行緒)來處理這個客戶請求。新程序(或執行緒)處理此客戶請求,並不需要對其他請求作出應答。服務完成後,關閉此新程序與客戶的通訊鏈路,並終止。 4、返回第二步,等待另一客戶請求。 5、關閉伺服器。 客戶端: 1、開啟一個通訊通道,並連線到伺服器所在主機的特定埠。 2、向伺服器發服務請求報文,等待並接收應答;繼續提出請求。 3、請求結束後關閉通訊通道並終止。
Socket程式設計的通訊方式
1、Socket進行程式設計時主要有4個概念,同步、非同步、阻塞、非阻塞。其中,同步、非同步時屬於通訊模式的概念,而阻塞、非阻塞則屬於套接字模式的概念。 同步方式: 通訊的同步,指客戶端在傳送請求後,不必等待服務端的迴應就可以傳送下一個請求。所以這個時候的所有請求將會在服務端得到同步。 非同步方式: 通訊的非同步,指客戶端在傳送請求後,不必等待服務端的迴應就可以傳送下一個請求,這樣對於所有的請求動作來說將會在服務端得到非同步,這條請求的鏈路就像一個請求佇列,所有的動作在這裡不會得到同步。 阻塞方式: 阻塞套接字是指執行此套接字的網路呼叫時,所呼叫的函式只有在得到結果之後才會返回,在呼叫結果返回之前,當前執行緒會被掛起,即此套接字一直阻塞在網路呼叫上。比如呼叫StreamReader類的ReadLine()方法讀取網路緩衝區的資料,如果呼叫的時候沒有資料到達,那麼此ReadLine( )方法將一直掛在呼叫上,直到讀到一些資料,此函式才返回。 非阻塞方式: 非阻塞和阻塞的概念相對應,非阻塞套接字是在執行此套接字的網路呼叫時,即使不能立刻得到結果,該函式也不會阻塞當前執行緒,而會立刻返回。對於非阻塞套接字,同樣呼叫StreamReader類的ReadLine()方法讀取網路緩衝區的資料,不管是否讀到資料都立刻返回,而不會一直掛在此函式呼叫上。 最常用的就是非同步非阻塞套接字 套接字可以向Stream流一樣被視為一個數據通道,這個通道架設在客戶端應用程式和伺服器端程式之間,資料的接收和寫入均對這個通道來進行。因此要通過網路通訊,就至少需要一對套接字。套接字之間的連線過程可以分為三個步驟: 1、伺服器監聽 2、客戶端請求 3、連線確認 常用方法 1、Bind() 套接字繫結到特定地址 2、Listen() 完成地址的繫結後,使用Listen監聽客服端傳送的連線請求 3、Accept() 伺服器進入監聽狀態,如有從客戶端發來的連線請求,伺服器使用Accept()方法來接收連線請求。並返回一個新的套接字,處理本連線的所有通訊 4、Send() 傳送資料 5、Receive() 接收資料 6、Connect() 7、Shutdown() 8、Close()