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服務端 寫乙個接收訊息的方法,可以接收客戶端訊息並解碼輸出 服務端被動監聽,每有乙個客戶端連線就建立乙個子執行緒執行接收訊息方法 單程序輪詢...