黑馬程式設計師 網路通訊機制和Socket的簡單了解

2021-06-18 12:00:17 字數 3041 閱讀 5773

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

asp.net+android+ios開發

、.net培訓

、期待與您交流! ----------------------

在我們的電腦上,一般都會裝有qq、yy、或網路遊戲等需要通過聯網實現其功能的程式,那麼計算機是如何通過網路來聯絡其它裝置上的程式呢?先看下圖:

如圖所示:假設有3臺計算機通過網路互相聯接,每個計算機都被分配有乙個ip位址,計算機之間可以通過ip位址實現互相訪問。如果計算機1想訪問計算機3,就必須先通過計算機3的ip位址(192.168.1.3)找到計算機3,這樣才能實現訪問。現在計算機1和計算機3都有乙個qq應用程式,此時計算機1通過qq給計算機3傳送訊息,這條訊息附帶有ip位址和埠號(192.168.1.3:101),它通過計算機3的ip位址傳到計算機3裡面。可是計算機3又正在執行乙個yy應用程式,那麼計算機3該把接收到的資訊傳給誰呢?事實上,我們會給每個應用程式繫結乙個埠。當計算機上的網絡卡接收到網路傳來的訊息的時候,它會向每個應用程式傳送這條訊息,只有埠號匹配的程式才會接收這條訊息。

socket的英文原義是「孔」或「插座」,作為程序通訊機制,取後一種意思,通常也稱為「套接字」。socket用於描述ip位址和埠,是乙個通訊鏈的控制代碼,說白了其實就是讓兩個程式通訊用的。socket非常類似於**插座,以乙個**網為例。**的通話雙方相當於兩個相互通訊的程式,**號碼就是ip位址。任何使用者在通話之前,首先要占有一部**機,相當於申請乙個socket;同時要知道對方的號碼,相當於對方有乙個固定的socket;然後向對方撥號呼叫,相當於發出連線請求;對方假如在場並且空閒,那他就會拿起話筒開始通話,相當於連線成功;雙方通話的過程,是一方向**機發出訊號,對方從**機接收訊號的過程,相當於用socket傳送資料和用socket接收資料;通話完畢後,一方掛掉**,相當於關閉socket,撤消連線。

socket本身並不能和外界通訊,它只是呼叫系統的套接字來和外界通訊。在internet上有很多個這樣的主機,這些主機一般執行的很多服務軟體,同時提供幾種服務。每種服務都開啟乙個socket,並繫結到乙個埠上。不同的埠對應於不同的服務(應用程式)。例如:http使用80商品,ftp使用21埠,smtp使用23埠等。

socket有兩種型別,第一種是流式socket(stream),它是一種面向連線的socket,針對於面向連線的tcp服務應用,安全性好,但效率低。第二種資料報式socket(datagram),它是一種無連線的socket,對應於無連線的udp服務應用,不安全(易丟失、順序混亂、在接收端在分析重排及要求重發),但效率高。

socket的一般應用模式是伺服器端和客戶端。服務端會有乙個socket負責監聽是否有客戶端的連線訊息,然後客戶端也有乙個socket,它連線服務端指定埠,負責接收和傳送服務端的訊息。如果服務端負責監聽的socket監聽到有客戶端發來連線請求,那麼它就會建立乙個新的連線socket,專門負責和客戶端通訊。通過以上socket的工作流程,我們可以發現socketz應用模式的以下幾個特點。

伺服器端的socket至少需要兩個:其中乙個負責接收客戶端的連線請求,但不負責與客戶端通訊。當伺服器端每成功接收到乙個客戶端的連線請求時,它都會在伺服器端產生乙個對應的socket,負責和客戶端通訊。而客戶端會通過建立乙個socket物件來初始化乙個伺服器端的tcp連線,連線socket必須指定將要連線的伺服器端的位址和埠。

如下圖為socket的通訊過程:

套接字的使用分為兩種模式:阻塞模式和非阻塞模式。阻塞模式也稱為同步模式,在這種模式下,socket操作直到全部操作完成後才返回。也就是當接收訊息時,它需要阻塞當前所在的執行緒,直到監聽到有訊息傳送完畢,當前執行緒才會響應。在bsd unix中,套接字是以阻塞模式執行的,這對以命令列方式執行的unix程式來說不是問題,但阻塞模式不太適合於windows下的訊息驅動體系,所以windows為所有函式提供了非阻塞模式的版本,非阻塞模式又稱為非同步模式。非同步模式就是建立另外乙個執行緒來監聽訊息。一般來說,socket介面推薦使用非阻塞模式進行通訊程式設計,僅在絕對有必要的情況下才採用阻塞方式進行通訊程式設計。

socket類為網路通訊提供了一套豐富的方法和屬性。所要求的命名空間為system.net.sockets。乙個socket例項包含了一相本地或者乙個遠端端點的套接字資訊。socket類的建構函式為:

public socket(addressfamily addressfamily, sockettype sockettype, protocoltype protocoltype);
其中addressfamily為網路型別,指定socket使用的定址方案,例如,addressfamily.internetwork表明為ipv4的位址;sockettype指定socket型別,例如,sockettype.stream表明連線是基於流套接字的,而sockettype.dgram表示連線是基於資料報套接字的;protocoltype是指定socket使用的協議,例如protocoltype.tcp表示連線協議是tcp協議,而protocoltype.udp則表明連線協議是udp協議。

socket建構函式的3個引數中,對於網路上的ip通訊來說,addressfamily總是使用addressfamily.internetwork列舉值。而sockettype引數則與protocoltype引數配合使用,不允許其它的匹配形式,也不允許混淆匹配。下表列出了可用於ip通訊的匹配組合:

sockettype

protocoltype

說明dgram

udp無連線通訊

stream

tcp面向連線通訊

rawicmp

internet控制報文協議

rawraw

簡單ip包通訊

套接字建立後,就可以用socket提供的一些屬性方便地設定或檢索資訊。

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

asp.net+android+ios開發

、.net培訓

、期待與您交流! ----------------------

黑馬程式設計師 反射機制

反射故名思意,就是將乙個物件對映出來。型別能看清裡面的架構。就好比乙個鏡子裡照映出自己的影子一樣。1 如何獲取物件的型別名?class sample1 public class classreflection 2 如何獲取物件的構造方法?class sample1 public sample1 st...

黑馬程式設計師 網路程式設計

asp.net android ios開發 net培訓 期待與您交流!1.套接字 socket 用於描述 ip位址和埠,是乙個通訊鏈的控制代碼 就是兩個程式通訊用的 類似於 2.有兩種型別 流式socket 是一種面向連線的 socket 針對於面向連線的 tcp服務應用,安全,但效率低 資料報式 ...

黑馬程式設計師 網路程式設計

asp.net android ios開發 net培訓 期待與您交流!1 網路程式設計 1 網路程式設計 通過程式語言實現計算機鍵的資料通訊。2 網路程式設計的三要素 a ip位址。網路中每一台計算機的唯一標識。b 埠 用於標識程序的邏輯位址 c 協議 定義通訊規則 舉例 我要和小青說話。a 找到小...