python網路程式設計基礎

2021-09-20 05:25:18 字數 2273 閱讀 9088

目錄

標籤(空格分隔): 網路程式設計

目錄tcp和udp

tcp的使用是面向連線的,即資料的傳輸必須基於虛鏈路的完整建立。虛鏈路的建立提供了很多優秀的功能,比如確認重傳以保證資料的完整性,滑動視窗以保證資料傳輸的高效性,各類選項字段提供不同的可選功能。tcp的缺點是報頭大,因為需要包含比udp更多的功能字段,而且tcp資料的每次傳送都必須得到確認否則將會重傳。tcp一般應用於對資料完整性要求很高的場景。比如:ssh。

tcp的報頭字段比較多,核心有:seq和ack用於處理確認重傳、syn/fin/rst等用於提供資料報身份標記、視窗用於處理流量控制、還有各種選項。

為了將路由交換和應用層分離開,socket提供了乙個統一的介面**用層直接呼叫而無需考慮底層路由交換的通訊問題。

所有的作業系統都提供socket呼叫,python的socket模組也是對底層socket模組的封裝,並提供了方便使用的一些函式介面。

1、建立物件

# 例項化乙個socket物件,用於處理本地的socket事務,不論是伺服器還是客戶端都一樣

# socket模組提供了很多不同型別的socket,這裡選擇tcp,使用ipv4

sock = socket.socket(socket.af_inet, socket.sock_stream)

2、bind
# socket物件可以繫結本地的ip和埠號,這個函式在伺服器和客戶端均可使用,不過一般不會繫結客戶端

# 客戶端的ip和埠一般使用隨機。

# 伺服器一般會固定ip和埠以供大量客戶端連線

# 伺服器提供的ip會通過dns發布網域名稱

# bind的引數是乙個ip+port的元組,如果沒有提供ip,則會監聽本機所有對外介面ip

sock.bind(('127.0.0.1', 8080))

3、listen
# 此函式只應該用於伺服器,因為伺服器才需要監聽埠等待客戶主動連線

# 此函式將會告知作業系統監聽socket連線

# 此函式的底層操作應該就是完成tcp三次握手

# 此函式的5表示已經完成三次握手的客戶端最大數量,但是這些客戶端還未與伺服器互動資料

sock.listen(5)

4、connect
# 此函式只應該用於客戶端,因為客戶端才需要連線伺服器的埠

# 此函式一旦啟動,則會在客戶端上隨機選取本地埠

# 此函式的語義是發起tcp三次握手

sock.connect(('127.0.0.1', 8080))

5、accept
# 此函式應該用於伺服器,當tcp三次握手完成之後,伺服器通過此函式獲取此客戶端socket物件和位址。

# 此函式是乙個阻塞函式,即,如果伺服器沒有任何虛鏈路完成,將會無限阻塞,直到有乙個虛鏈路通過

# listen完成,accept才會返回。

# 如果要伺服器提供無限接收客戶端的功能,應該迴圈此函式以提供鏈路迴圈

conn, addr = sock.accept()

6、recv
# 此函式用於從乙個socket物件(管道)中獲取資料,而實際上,是從作業系統的網絡卡快取中獲取資料

# 可以指定需要一次獲取的位元組數,獲取得到的資料是bytes型別,需要decode才方便閱讀

# 此函式是乙個阻塞函式,即,如果網絡卡快取沒有任何資料,則會一直阻塞到資料到達為止

msg = conn.recv()

7、send
# 此函式用於將bytes型別的資料傳送給socket物件(管道),而實際上,是傳送給網絡卡快取,後續交由

# 作業系統真正的傳送資料。

# 此函式非阻塞,可以直接返回,不過要特別注意的是,msg如果為空,此函式可以正確執行,但是實際上

# 作業系統是沒有傳送資料給對端的。這樣會產生一些socket連線的問題,所以要杜絕發空。

conn.send(msg)

8、close
# 關閉虛鏈路

conn.close()

9、getpeername
# 獲取乙個虛鏈路對端的位址二元組

print(sock.getpeername())

根本原因:tcp面向流,無法區分訊息之間的資料邊界,固定recv就會導致訊息粘包

解決思路:每次recv的時候動態獲取,並準確的獲取乙個訊息的長度

解決辦法:每乙個訊息都增加固定長度的報頭。每次recv的時候先獲取固定長度的報頭,從報頭中獲取本次訊息的準確長度,然後再recv完整準確的資訊。

python網路程式設計基礎

客戶 伺服器架構 伺服器 是乙個軟體或硬體,用於提供客戶需要的 服務 伺服器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然後再等待其他的請求.常見的服務型別 硬體的客戶 伺服器架構 印表機,檔案伺服器 軟體客戶 伺服器架構 web伺服器,資料庫伺服器,視窗伺服器 gui 套接字 用於程序間通訊...

python 網路程式設計基礎

python實在是太方便,太易用了,三方庫的支援又全,語法又簡單,對開發人員來說,實在是居家旅行,x的必備利器。週末研究了下python的網路支援,做一下記錄,以備隨後翻閱。python支援bsd的socket進行網路程式設計,其api跟c中的大同小異,先看看tcp方式的,說到網路程式設計,肯定會設...

Python網路程式設計基礎

應用socket 的常用方法 socket 介紹 socket套接字 python 中提供了socket.py標準庫,非常底層的介面 socket是一種通用的網路程式設計介面,和網路層次沒有一一對應的關係 協議族af表示address family,用於socket 第乙個引數 名稱含義 af in...