當前位置:
首頁 > 最新 > Python之網路編程

Python之網路編程

一、網路、網路編程的概念

網路:網路是由節點和連線構成,表示諸多對象及其相互聯繫。在這裡我們所說的是與編程有關的計算機網路,簡單地說計算機網路是根據不同域名來區分網路的。

網咯程序:可以分為基於應用的網路程序和基於瀏覽器的網路程序。例如,qq、微信、微博等就是基於應用的網路程序,而百度、知乎、博客網等是基於瀏覽器的網路程序。

所有的網路程序都是通過網路通信進行聯繫的。

網路實現通信的條件:

硬體條件:網卡和網線,網卡上要有全球唯一的mac地址。

arp協議——通過ip地址就能找到mac地址

交換機——解決多台機器之間的通信問題。

二、軟體開發的架構模式

兩個程序之間通訊的應用大致可以分為兩種:第一種是應用類:qq、微信、網盤、優酷這一類是屬於需要安裝的桌面應用;第二種是web類:比如百度、知乎、博客園等使用

瀏覽器訪問就可以直接使用的應用。這些應用的本質其實都是兩個程序之間的通訊。而這兩個分類又對應了兩個軟體開發的架構模式。

1)C/S架構

C/S即:Client與Server ,中文意思:客戶端與伺服器端架構,這種架構也是從用戶層面(也可以是物理層面)來劃分的。

服務端(Server):我一直運行,等待服務別人;客戶端(Client):我需要使用時,我才使用服務。

2)B/S架構

B/S即:Browser與Server,中文意思:瀏覽器端與伺服器端架構,這種架構是從用戶層面來劃分的。

Browser瀏覽器,其實也是一種Client客戶端,只是這個客戶端不需要大家去安裝什麼應用程序,只需在瀏覽器上通過HTTP請求伺服器端相關的資源(網頁資源),

客戶端Browser瀏覽器就能進行增刪改查。

B/S架構火的兩點原因:(1)不需要額外的安裝客戶端了,只需要一個網址就可以訪問;(2)輕量級 - 使用成本低。

3)C/S與B/S兩者的關係:B/S是C/S的一種特殊形式。

小編給大家推薦一個學習氛圍超好的地方,python交流企鵝裙:【六一 一,五三零,一零一】!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙里有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程

三、計算機網路的發展史及基礎網路概念

1)發展史

早期:聯機(網線)——乙太網(區域網和交換機)——廣域網和路由器——tcp協議和udp協議

2)重要的網路概念

mac地址:物理地址或硬體地址,用來定義網路設備的位置。

head中包含的源和目標地址由來:ethernet規定接入internet的設備都必須具備網卡,發送端和接收端的地址便是指網卡的地址,即mac地址。

mac地址:每塊網卡出廠時都被燒制上一個世界唯一的mac地址,長度為48位2進位,通常由12位16進位數表示(前六位是廠商編號,後六位是流水線號)

ip地址與ip協議:規定網路地址的協議叫ip協議,它定義的地址稱之為ip地址。

廣泛採用的v4版本即ipv4,它規定網路地址由32位2進位表示;

範圍0.0.0.0-255.255.255.255;

一個ip地址通常寫成四段十進位數,例:172.16.10.1

埠:"埠"是英文port的意譯,可以認為是設備與外界通訊交流的出口。因此ip地址精確到具體的一台電腦,而埠精確到具體的程序。

埠號——找到程序,網路相關的程序才需要開一個埠,為的是找到計算機上唯一的程序

cmd命令:netstat -an 查看所有埠號 在計算機上,每一個通信程序都會開一個埠。

在同一時間只會有一個程序佔用一個埠,不可能在同一時間有兩個程序佔用同一個埠。

埠範圍;0-65535,一般情況下習慣用8000之後的埠。

arp協議——查詢ip地址與mac地址組件的關係

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。

ARP命令可用於查詢本機ARP緩存中IP地址和MAC地址的對應關係、添加或刪除靜態對應關係等,通過ip找到mac。

網關的概念——區域網中的機器想要區域網外的機器,需要要通過網關訪問。

子網掩碼——通過ip地址與子網掩碼按位與運算,判斷任意兩個IP地址是否處在同一個子網路。

3)ip和埠間的關係

ip——確定唯一的一台機器

埠——確定唯一的程序

ip+埠——找到唯一的一台機器的唯一的程序

4)tcp協議和udp協議

tcp協議:可靠的、面向連接、耗時長,tcp是網際網路中的傳輸層協議。

三次握手:使用三次握手協議建立連接。

四次揮手:建立一個連接需要三次握手,而終止一個連接要經過四次握手,這是由TCP的半關閉(half-close)造成的。

udp協議:不可靠的、無連接、效率高,udp也是傳輸層的協議。

tcp和udp的對比:

TCP---傳輸控制協議,提供的是面向連接、可靠的位元組流服務。當客戶和伺服器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。

TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。

由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。

5)必須清楚

ip協議屬於網路osi七層協議中的哪一層?——網路層

tcp和udp協議屬於傳輸層

arp協議屬於數據鏈路層

四、socket概念

1)socket層

Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,

對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議。

3)套接字(socket)的發展史

套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 因此,有時人們也把套接字稱為「伯克利套接字」或「BSD 套接字」。

一開始,套接字被設計用在同 一台主機上多個應用程序之間的通訊。這也被稱進程間通訊,或 IPC。套接字有兩種(或者稱為有兩個種族),分別是基於文件型的和基於網路型的。

基於文件類型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信

基於網路類型的套接字家族

套接字家族的名字:AF_INET

(還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,

AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由於我們只關心網路編程,所以大部分時候我么只使用AF_INET)

4)tcp協議和udp協議

TCP(Transmission Control Protocol)可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向位元組流。

使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸程序。

UDP(User Datagram Protocol)不可靠的、無連接的服務、傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。

使用UDP的應用:域名系統 (DNS);視頻流;IP語音(VoIP)。

我知道說這些你們也不懂,直接上圖。

五、套接字(Socket)的使用

具體可以分為兩類:基於tcp協議的socket和基於udp協議的socket

1)基於tcp協議的socket

tcp是基於連接的,必須先啟動伺服器,然後再啟動客戶端去連接服務端。

Server端

1 import socket 2 3 sk = socket.socket() #創建服務端套接字對象 4 5 sk.bind(("127.0.0.1",8898)) #把地址綁定到套接字上 6 7 sk.listen() #監聽連接 8 9 conn,addr = sk.accept() #接收客戶端連接 10 ret = conn.recv(1024) #接收客戶端信息 11 12 print(ret) #列印客戶端信息 13 conn.send(b"hi") #向客戶端發送信息 14 15 conn.close() #關閉客戶端套接字 16 sk.close() #關閉伺服器套接字

Client端

1 import socket 2 3 sk = socket.socket() #創建客戶端套接字對象 4 5 sk.connect(("127.0.0.1",8898)) #嘗試創建連接 6 7 sk.send(b"hello") 8 ret = sk.recv(1024) #對話 9 print(ret) 10 11 sk.close() #關閉客戶端套接字

問題:在重啟服務端時可能會出現以下錯誤

解決方法:

1 #加入一條socket配置,重用ip和埠 2 import socket 3 4 from socket import SOL_SOCKET,SO_REUSEADDR 5 6 sk = socket.socket() 7 8 sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 9 sk.bind(("127.0.0.1",8898)) #把地址綁定到套接字 10 sk.listen() #監聽鏈接 11 12 conn,addr = sk.accept() #接受客戶端鏈接 13 ret = conn.recv(1024) #接收客戶端信息 14 print(ret) #列印客戶端信息 15 conn.send(b"hi") #向客戶端發送信息 16 17 conn.close() #關閉客戶端套接字 18 sk.close() #關閉伺服器套接字(可選)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

深入理解 RPC:基於 Python 自建分散式高並發 RPC 服務
並發體驗:Python抓圖的8種方式

TAG:Python |