標籤:之間 進入 pycharm cal 流式 參數 接收 返回 壓縮最佳化
python的網路編程有不少痛點,也容易忘記,最近我會陸續發出系統、完整pythonnet知識的部落格,一邊複習一邊分享,感興趣的可以關注我。
話不多說,開始吧。
網路編程
目的:資料的傳輸
ISO(國際標準組織)
OSI七層模型----->網路通訊的標準化流程
應用程式層:提供使用者服務,具體的內容由特定的程式規定
展示層:提供資料的加密和壓縮最佳化
會話層:確定建立應用連結,選擇傳輸服務
傳輸層:提供Data Transmission Service,進行流量控制
網路層:路由選擇,網路互聯
鏈路層:提供鏈路交換,具體訊息的發送
物理層:物理硬體,介面,網卡的規定
可劃分為四層模型
四層模型
應用程式層
傳輸層
網路層
物理鏈路層
劃分為五層模型(TCP/IP模型)
應用程式層(應用程式層 展示層 會話層)
傳輸層
網路層
鏈路層
物理層
OSI模型的優點:將功能分開,降低網路傳輸中的耦合度,使開發流程更加清晰,
每部分各司其職。
高彙總:每個模組功能盡量單一,不會多個功能摻雜
低耦合:盡量降低每個模組之間的關聯性
網路通訊協定:在網路通訊中協議各方必需遵守的規定。如建立什麼串連,訊息結構如何解析等。
應用程式層:TFTP HTTP DNS SMTP
傳輸層:TCP UDP
網路層:IP
物理層:IEEE
網路相關概念
網路主機:在網路上確定一台主機
本地使用:“localhost” 127.0.0.1
網路地址:"0.0.0.0" "172.60.50.54"(本機網路IP)
查看本機IP地址:ifconfig (linux)
ipconfig (windows)
ipython3 進入互動模式
通過電腦名稱擷取匹配的IP
socket.gethostbyname("localhost")
"127.0.0.1"
擷取原生電腦名稱
socket.gethostname()
"xxxx"
IP地址
網路上確定一台主機的地址
IPv4:點分十進位
IPv6:128位
網路連接測試
ping 172.60.50.182
特殊IP
127.0.0.1 本地測試IP
0.0.0.0 自動使用本地可用網卡IP
192.168.1.0 代表當前網段
192.168.1.1 通常為網關地址
192.168.1.255 廣播位址
IP地址轉換為十六進位表達
socket.inet_aton(‘192.168.1.2‘)
b‘\xc0\xa8\x01\x02‘
網域名稱:網路伺服器地址在網路上的名稱
連接埠號碼: 連接埠號碼是地址的一部分,在一個系統中每個網路應用監聽不同的連接埠,以擷取對應連接埠傳遞的資訊
取值範圍 : 1----65535
1-255 一些通用連接埠 (眾所周知的程式佔用)
256 --1023 系統連接埠
1024 -- 65535 自用連接埠 >10000
傳輸層服務
連線導向的傳輸服務 ---》 tcp協議
傳輸特徵:
可靠的資料轉送
可靠性 : 資料在傳輸中,無失序 無差錯 無丟失 無重複
在資料轉送前和傳輸結束後需要建立串連和中斷連線
三向交握 : 在連線導向的傳輸服務中建立串連的過程
1. 用戶端向伺服器發送串連請求
2. 伺服器接受到請求進行確認,返回確認報文
3. 用戶端收到伺服器回複最終確認串連
四次揮手 : 在連線導向的傳輸服務站中斷連線的過程
1. 主動方發送報文,告知被動方要中斷連線
2. 被動方回複報文,表示已經接收到請求,準備斷開
3. 被動方再次發送報文,表示準備處理就緒,可以斷開
4. 主動發發送確認報文,中斷連線
應用情況 : 適用於傳輸較大的內容或檔案,網路良好,需 要保證傳輸可靠性的情況
e.g. 聊天資訊 檔案的上傳下載, 郵件處理
網頁擷取
面向不需連線的傳輸服務 ---》 udp協議
傳輸特點:
不保證傳輸的可靠性
沒有串連和斷開的過程
資料的首發比較自由
適用情況 : 網路情況可能產生丟包,對傳輸可靠性要求低
e.g. : 網路視頻, 群聊,廣播等
socket 通訊端編程
目的 : 通過程式設計語言提供的通訊端編程介面,可以更簡單的完成基於tcp和udp的編程
通訊端 : 完成上述目標的一種編程手段
通訊端類別
流式通訊端(SOCK_STREAM):傳輸層基於tcp的協議通訊
連線導向可靠的傳輸 tcp的傳輸 流式通訊端
資料通訊端(SOCK_DGRAM): 傳輸層基於udp協議傳輸
面向無串連不可靠的傳輸 udp的傳輸 資料通訊端
底層通訊端 (SOCK_RAM): 訪問底層協議通訊端
TCP的服務端
import socket
1. 建立通訊端
socket.socket(sock_family = AF_INET,
sock_type = SOCK_STREAM,
proto = 0)
功能 : 建立通訊端
參數 : sock_family 地址族類型 AF_INET ipv4網路通訊
sock_type 通訊端類型 SOCK_STREAM 流式
SOCK_DGRAM 資料報
proto 通常為0 選定子協議類型
傳回值 : 返回通訊端對象
2. 綁定地址
sockfd.bind(addr)
功能 : 綁定地址
參數 : addr ---》 元組 (ip,port) (‘0.0.0.0‘,1234)
3. 設定監聽通訊端
sockfd.listen(n)
功能: 將通訊端設定為監聽通訊端,建立監聽隊列
參數: 監聽隊列大小
* 一個監聽通訊端可以串連多個用戶端
4. 等待接受用戶端串連
connfd,addr = sockfd.accept()
功能 : 阻塞等待處理用戶端串連
傳回值 : connfd 新的通訊端,用於和用戶端通訊
addr 串連的用戶端的地址 (ip,port)
* 阻塞函數 : 當程式運行到阻塞函數位置,如果某種條件沒有達成則暫停程式運行,知道條件達成結束阻塞
5. 訊息的收發
data = connfd.recv(buffersize)
功能 : 接受訊息
參數 : 一次接受訊息的大小 位元組
傳回值 : 返回接受到的內容
n = connfd.send(data)
功能 : 發送訊息
參數 : 要發送的內容 (bytes格式)
傳回值 : 返回實際發送的位元組數
6. 關閉通訊端
sockfd.close()
* telnet ip port
用戶端
1. 建立通訊端 (和服務端通訊端類型相同)
2. 發起串連
connect(addr)
功能 : 向服務端發起串連
參數 : 服務端地址 元組
3. 訊息收發
4. 關閉通訊端
下面看代碼,此為用戶端代碼
此為服務端代碼:
好了,本小節完,小夥伴們可以使用pycharm(社區版免費)運行試試看,我們下次見!
pythonnet-網路編程(1)