socket、tcp/ip協議、udp協議


socket通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄,應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。

socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,對於文件用【打開】【讀寫】【關閉】模式來操作。 socket就是該模式的一個實現,socket是一種特殊的文件,一些socket函數就是對其進行的操作(打開、讀/寫IO、關閉)。

socket和file的區別:

文件是都是在同一台計算機上,兩個進程之間傳輸數據。

socket可以實現在不同的計算機之間傳輸數據,也就是網絡傳輸數據。比如說qq、打開一個網頁,這些都是socket來實現通信的。

那網絡通信呢又要說到tcp/ip協議和udp協議,socket里面已經封裝好了upd和tcp/ip協議,直接使用就可以了。

簡單說下tcp/ip協議是干嘛的,網絡剛出來的時候,一片混亂,那要傳輸數據就得大家都遵守一個規則,大家都按照這個,然后就出現了tcp/ip協議。也許你聽過3次握手,4次斷開,說的就是tcp/ip連接的一個過程。加入a計算機要和b計算機通信,過程是這樣的

a:在嗎,我可以連你嗎
b:在,你連吧
a:好的,我要給你發數據了

#這就是3次握手,這就建立好通道了,兩台計算機就可以進行通行了。

那么4次斷開是什么呢

a:我要和你斷開了
b:好的,你斷開吧
b:關閉通道
a:關閉通道

為什么關閉2次呢,因為兩端要互相傳數據,挖了兩條路,一條路用來b給a傳數據,另外一條是a給b傳數據,所以是2次關閉,各自關閉各自的通道。這兩條路呢,就有個次叫全雙工,就是兩邊都可以互相發送數據,如果只有一端可以發送數據,那就叫單工。

下面這個圖,就可以看到建立連接的過程和傳輸數據的過程,以及斷開的過程。

 

而udp協議就比較簡單了,沒有那么復雜的斷開和連接,不需要3次握手,不需要確定客戶端、服務端是否能收到,tcp/ip是必須建立好連接之后,才能發數據,而udp是無連接的,知道ip和端口號直接就是發,它比tcp/ip快,但是不安全。

upd就像寫信一樣,有可能在路上就沒有了,對方沒有收到。而tcp/ip就像打電話一樣,必須得接通才能說話。

下面是udp server端的代碼:

下面是client端的代碼

先運行server端的代碼再運行client的向server端發送數據,server端再返回數據,做一個簡單的聊天的小程序,結果如下

 

下面是tcp/ip協議的代碼,server端代碼:

 

#下面是客戶端連接服務端的代碼

 

大家可能會想,學這個有啥用呢,其實這些web框架底層就是這么實現的,比如說django、flask這些,會了socket,我們也可以自己開發一個web框架。當然現在只能一次給一個客戶端服務,用了多線程或者多進程就可以為多個客戶端來服務了。

服務端運行結果

下面用多線程,每次有客戶端連過來就啟動一個線程來服務,這樣就可以為多個客戶端服務了,用threading模塊啟動一個線程,來一個請求就啟動一個線程為他服務,代碼如下:

 


免責聲明!

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



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