Python網路程式設計之Part01 網路程式設計初識

2021-10-04 18:00:32 字數 4567 閱讀 8421

1.網際網路模型:

由於不同機器上的程式要通訊,才產生了網路,才有了網際網路,網際網路模型按照功能分為 osi七層 或 tcp/ip五層 或 tcp/ip四層 模型,我們最常用的是 tcp/ip五層模型,從上到下依次是:

層功能 (協議)

裝置應用層

各類應用軟體(資料)

手機/電腦等

傳輸層選擇通訊傳輸協議(tcp/udp,封裝埠號等資訊,tcp頭部)

四層交換機,四層路由器

網路層網路傳輸協議(ip協議,封裝ip位址等資訊,ip報頭部)

三層交換機,路由器

資料鏈路層

arp/rarp協議(封裝mac位址等資訊,mac頭部,乙太網幀)

網橋,乙太網交換機,網絡卡

物理層位元流

中繼器,網線

3.埠計算機上每乙個需要網路通訊的程式,都會開乙個埠,在同一時間,只會有乙個程式占用乙個埠,不可能在同一時間同一計算機上有兩個程式,占用同乙個埠,埠的範圍: 0-65535,一般情況下我們使用 8000 以後的埠,我們通過: ip - 確定唯一一台機器, 埠 - 確定唯一乙個程式,那麼 ip+埠 - 確定唯一一台機器上指定的程式

當客戶端需要與伺服器進行通訊時,客戶端由應用層將資料發出,到傳輸層,隨機從乙個埠發出,則源埠號就是這和隨機的埠號,目的埠就是伺服器的服務埠,到網路層,源ip就是本機ip,目的ip就是伺服器ip,到數鏈層,再新增由arp協議找到目的ip對應的mac位址,源mac位址就是本機的mac位址,最後再加一些報頭資訊封裝成乙個乙太網幀 (乙個乙太網幀的最大長度不超過1500位元組,即mtu,最大傳輸單元的大小),經過調製,在物理層由光訊號或者電訊號進行傳輸。

socket - 套接字:它是應用層與tcp/ip協議族通訊的 中間軟體抽象層,它是一組把複雜的tcp/ip協議族隱藏在socket介面後面的介面;

在實際的程式編寫中,socket就是乙個模組,我們呼叫模組中已經實現的方法建立2個程序之間的鏈結和通訊,套接字有兩種:分別是基於檔案型(af_unix)的和基於網路型(af_inet)的。

在網路程式設計中,我們需要編寫兩個檔案:服務端檔案server,客戶端檔案client,我們使用socket模組來實現乙個最基礎的tcp連線:

# server服務端

import socket

sk = socket.socket(

)# 建立乙個套接字物件

sk.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)

# 允許埠復用

sk.bind(

('127.0.0.1'

,8080))

# 為套接字繫結ip和埠 比喻為繫結手機卡

sk.listen(

)# 監聽

connection,addr = sk.accept(

)# 拿到乙個連線, 和對方的ip位址

content = connection.recv(

1024

)# 返回接受到的訊息

print

(content)

# 引數是乙個正整數,一般為1024的整數倍,是一次能接受的資料的最大位元組數

connection.send(b'hello'

)# 傳輸的資料必須是 bytes 型別,

content = connection.recv(

1024

)print

(content.decode(

'utf-8'))

# 用什麼發過誓編碼就要用什麼方式解碼,否則輸出就是亂碼

connection.send(

bytes

('今天中午吃麵.'

,encoding=

'utf-8'))

connection.close(

)# 關閉連線

sk.close(

)# 關閉套接字--

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-注意事項:

1.建立tcp套接字物件時 socket.socket(socket.af_inet,socket.sock_stream) 等價於 socket.socket(

)2.socket.listen(n) n是乙個正整數,表示socket的'排隊數量'

,即:伺服器能後台掛起的最大連線數(當前正在處理的連線不計算在內)

3.有兩次阻塞的位置:socket.accept(

),connection.recv(

);

import socket

sk = socket.socket(

)# 拿到乙個socket物件

sk.connect(

('127.0.0.1'

,8080))

# 客戶端與服務端建立連線

sk.send(b'hello, this is cient.'

)# 給服務端傳送訊息,注意傳送時的資料必須是byte型別

content = sk.recv(

1024

)# 從服務端接收訊息並返回

print

(content)

# 傳送中文訊息 - 以位元組形式並且指定編碼方式

sk.send(

bytes

('今天中午吃什麼?'

.encode(

'utf-8'))

)content = sk.recv(

1024

)print

(content.decode(

'utf-8'))

sk.close(

)# 關閉套接字

server端執行結果:

client端執行結果:

# 服務端server.py

import socket

sk = socket.socket(

type

=socket.sock_dgram)

# 帶type=socket.sock_dgram表明建立乙個udp的物件

sk.bind(

('127.0.0.1'

,8080))

msg,addr = sk.recvfrom(

1024

)# udp返回 收到的訊息和傳送方的位址

print

(msg.decode(

'utf-8'

),addr)

sk.sendto(b'bye'

,addr)

# udp 傳送訊息時,必須帶上位址,因為它面向無連線,若是沒有位址,就不知道要發去哪

sk.close()-

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

--注意事項:

1.udp 的套接字是: socket.socket(socket.af_inet,socket.sock_dgram) 等價於

socket.socket(

type

=socket.sock_dgram)

2.每次收發訊息,都要帶著位址和埠號,因為udp面向無連線,如果沒有位址,就找不到目的地了;

# 客戶端client.py

import socket

sk = socket.socket(

type

=socket.sock_dgram)

ip_port =

('127.0.0.1'

,8080

)# 服務端的ip和埠

sk.sendto(b'this is client.'

,ip_port)

msg,addr = sk.recvfrom(

1024

)print

(msg.decode(

'utf-8'))

sk.close(

)

server端執行結果:

client端執行結果:

Python網路程式設計之UDP

udp處理資料報,是一種無連線的協議 伺服器端 server socket.socket socket.af inet,socket.sock dgram 繫結ip server.bind 192.168.1.104 221 while true 接收 data,address server.rec...

Python網路程式設計之socket

socket是網路連線端點。例如當你的web瀏覽器請求ansheng.me的 時,你的web瀏覽器建立乙個socket並命令它去連線ansheng.me的web伺服器主機,web伺服器也對過來的請求在乙個socket上進行監聽。兩端使用各自的socket來傳送和接收資訊。在使用的時候,每個socke...

Python網路程式設計之tcp socket服務端

建立乙個tcp socket伺服器接收客戶端傳送的資訊並返回給客戶端 以多執行緒方式實現接收客戶端資訊 將客戶端傳送的資訊解碼輸出 建立乙個tcp socket服務端 寫乙個接收訊息的方法,可以接收客戶端訊息並解碼輸出 服務端被動監聽,每有乙個客戶端連線就建立乙個子執行緒執行接收訊息方法 單程序輪詢...