因為互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議。 通信的時候,雙方必須知道對方的標識,好比發郵件必須知道對方的郵件地址。互聯網上每個電腦的唯一標識就是IP地址,類似 123.123.123.123。如果一臺電腦同時接入到兩 ...
因為互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議。
通信的時候,雙方必須知道對方的標識,好比發郵件必須知道對方的郵件地址。互聯網上每個電腦的唯一標識就是IP地址,類似 123.123.123.123
。如果一臺電腦同時接入到兩個或更多的網路,比如路由器,它就會有兩個或多個IP地址,所以,IP地址對應的實際上是電腦的網路介面,通常是網卡。
私信小編 01 可領取零基礎入門視頻一套!
許多常用的更高級的協議都是建立在TCP協議基礎上的,比如用於瀏覽器的HTTP協議、發送郵件的SMTP協議等。
一個IP包除了包含要傳輸的數據外,還包含源IP地址和目標IP地址,源埠和目標埠。
埠有什麼作用?在兩台電腦通信時,只發IP地址是不夠的,因為同一臺電腦上跑著多個網路程式。一個IP包來了之後,到底是交給瀏覽器還是QQ,就需要埠號來區分。每個網路程式都向操作系統申請唯一的埠號,這樣,兩個進程在兩台電腦之間建立網路連接就需要各自的IP地址和各自的埠號。
客戶端
大多數連接都是可靠的TCP連接。創建TCP連接時,主動發起連接的叫客戶端,被動響應連接的叫伺服器。
舉個例子,當我們在瀏覽器中訪問新浪時,我們自己的電腦就是客戶端,瀏覽器會主動向新浪的伺服器發起連接。如果一切順利,新浪的伺服器接受了我們的連接,一個TCP連接就建立起來的,後面的通信就是發送網頁內容了。
所以,我們要創建一個基於TCP連接的Socket,可以這樣做:
發送的文本格式必須符合HTTP標準,如果格式沒問題,接下來就可以接收新浪伺服器返回的數據了:
接收到的數據包括HTTP頭和網頁本身,我們只需要把HTTP頭和網頁分離一下,把HTTP頭列印出來,網頁內容保存到文件:
伺服器
和客戶端編程相比,伺服器編程就要複雜一些。
伺服器進程首先要綁定一個埠並監聽來自其他客戶端的連接。如果某個客戶端連接過來了,伺服器就與該客戶端建立Socket連接,隨後的通信就靠這個Socket連接了。
所以,伺服器會打開固定埠(比如80)監聽,每來一個客戶端連接,就創建該Socket連接。由於伺服器會有大量來自客戶端的連接,所以,伺服器要能夠區分一個Socket連接是和哪個客戶端綁定的。一個Socket依賴4項:伺服器地址、伺服器埠、客戶端地址、客戶端埠來唯一確定一個Socket。
連接建立後,伺服器首先發一條歡迎消息,然後等待客戶端數據,並加上Hello再發送給客戶端。如果客戶端發送了exit字元串,就直接關閉連接。
要測試這個伺服器程式,我們還需要編寫一個客戶端程式:
需要註意的是,客戶端程式運行完畢就退出了,而伺服器程式會永遠運行下去,必須按Ctrl+C退出程式。
小結
用TCP協議進行Socket編程在Python中十分簡單,對於客戶端,要主動連接伺服器的IP和指定埠,對於伺服器,要首先監聽指定埠,然後,對每一個新的連接,創建一個線程或進程來處理。通常,伺服器程式會無限運行下去。
同一個埠,被一個Socket綁定了以後,就不能被別的Socket綁定了。
源碼:
UDP編程
TCP是建立可靠連接,並且通信雙方都可以以流的形式發送數據。相對TCP,UDP則是面向無連接的協議。
使用UDP協議時,不需要建立連接,只需要知道對方的IP地址和埠號,就可以直接發數據包。但是,能不能到達就不知道了。
雖然用UDP傳輸數據不可靠,但它的優點是和TCP比,速度快,對於不要求可靠到達的數據,就可以使用UDP協議。
小結
UDP的使用與TCP類似,但是不需要建立連接。此外,伺服器綁定UDP埠和TCP埠互不衝突,也就是說,UDP的9999埠與TCP的9999埠可以各自綁定。
sever.py