流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)


 


 


      背景:


      有兩台計算機,一台為數據源服務器(提供數據服務),另一台為數據接收服務器(數據消費者),兩者之間已經建立了TCP
Socket的連接。現在主要討論接收方接收數據的情況。


     
.net平台下接收方接收數據時有三種方式。在此之前要明白流的概念,流是字節序列的抽象,呵呵,確實有點難理解,不過大家記住一點,流是字節序列相關的,說白了在計算機中的表現是與字節數組相關(比如,NetworkStream與Socket的接收數據緩存相關聯,默認大小是一個8192字節大小的接收緩沖區),也許我這種說法不全對,你可以試着這樣理解。


    第一種,直接用建立的Socket連接實例調用Receive()或BeginReceive()接收數據。


   
第二種用網絡流的方式接收,即用NetworkStream流實例的Read()與BeginRead()數據,在創建NetworkStream實例時以建立的Socket做為參數(new 
NetworkStream(已建立的Socket,...);,主要是為了與Socket的接收緩存相關聯。


  
第三種方式,用BufferedStream再串接一下NetworkStream流。大家首先要明白BufferedStream的作用,它是為另一種流再提供一個緩沖區,默認大小為4096字節大小,從其構造函數可以看出。這樣其它流就有兩個緩沖區,一個是流本身有的,另一個是BufferedStream提供的。所以用BufferedStream串接NetworkStream流后,再用BufferedStream實例的Read()或BeginRead()讀取數據會提高性能。


  
三種方式的性能比較:第一種和第二種速度相當,都是用的同一個緩沖區,第二種做法只是為了對流操作提供一個統一的接口,並沒有性能上的提高,僅個人看法,希望高手指點。第三種方式,的接收性能要優於前兩種。

 

 

 

--------------------------------------------------------------------------

Socket是一種特殊的I/O。常用的Socket類型有兩種:

   
流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對於面向連接的TCP服務應用;數據報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。


   Visual C#中操作Socket: 雖然Visual
C#可以使用NetworkStream來傳送、接收數據,但NetworkStream在使用中有很大的局限性,利用NetworkStream只能傳送和接收字符類型的數據如果要傳送的是一些復雜的數據如:二進制數據等,它就顯得能力有限了。但使用NetworkStream在處理自身可操作數據時,的確要比Socket方便許多。Socket(套接字)幾乎可以處理任何在網絡中需要傳輸的數據類型。


表01和表02是Socket類中的常用屬性和方法及其簡要說明


(比MSDN上翻譯的容易明白多了,嘿嘿)


屬性 說明
AddressFamily 獲取Socket的地址族。
Available 獲取已經從網絡接收且可供讀取的數據量。

Blocking 獲取或設置一個值,該值指示Socket是否處於阻塞模式。
Connected
獲取一個值,該值指示Socket是否已連接到遠程資源。
Handle 獲取Socket的操作系統句柄。
LocalEndPoint
獲取本地終結點。
ProtocolType 獲取Socket的協議類型。
RemoteEndPoint 獲取遠程終結點。

SocketType 獲取Socket的類型。



表01:Socket類的常用屬性及其說明


方法           說明
Accept 創建新的Socket以處理傳入的連接請求。
BeginAccept
開始一個異步請求,以創建新的Socket來接受傳入的連接請求。
BeginConnect 開始對網絡設備連接的異步請求。

BeginReceive 開始從連接的Socket中異步接收數據。
BeginReceiveFrom 開始從指定網絡設備中異步接收數據。

BeginSend 將數據異步發送到連接的
BeginSendTo 向特定遠程主機異步發送數據。
Bind
使Socket與一個本地終結點相關聯。
Close 強制Socket連接關閉。
Connect 建立到遠程設備的連接。

EndAccept 結束異步請求以創建新的Socket來接受傳入的連接請求
EndConnect 結束掛起的異步連接請求。

EndReceive 結束掛起的異步讀取。
EndReceiveFrom 結束掛起的、從特定終結點進行異步讀取。
EndSend
結束掛起的異步發送
EndSendTo 結束掛起的、向指定位置進行的異步發送。
GetSocketOption 返回Socket選項的值。

IOControl 為Socket設置低級別操作模式
Listen 將Socket置於偵聽狀態。
Poll
Receive
接收來自連接Socket的數據。
ReceiveFrom 接收數據文報並存儲源終結點。
Select 確定一個或多個套接字的狀態。

Send 將數據發送到連接的
SendTo 將數據發送到特定終結點。
SetSocketOption 設置Socket選項。

Shutdown 禁用某Socket上的發送和接收。



表02:Socket類的常用方法及其說明


其中“BeginAccept”和“EndAccept”、“BeginConnect”和“EndConnect”、


“BeginReceive”和“EndReceive”、“BeginReceiveFrom”和“EndReceiveFrom”、


“BeginSend”和“EndSend”、“BeginSendTo”和“EndSendTo”是六組異步方法,


其功能分別相當於“Accept”、“Connect”、“Receive”、“ReceiveFrom”、


“Send”和“SendTo”方法。


    下面就通過一個具體的示例,來介紹Visual C#中如何通過托管Socket實現數據傳送和接收的具體方法。


    本文示例其實是由二部分組成,也可以看成是客戶機程序和服務器程序。客戶機程序功能是通過
Socket向服務器程序創建連接,並在連接完成后,向服務器發送數據;服務器程序通過偵聽端口,接受網絡的Socket的連接請求,並在連接完成后,接收從客戶機發送來的數據,並顯示出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM