Python 標準庫 socket 創建UDP連接
前面介紹了創建TCP連接,請見
木頭人:Python 標準庫 socket 套接字網路通訊簡介與創建TCP連接一、UDP與TCP通訊區別
UDP 無連接,通訊不需要建立連接;它支持一對一,一對多,多對一和多對多的交互通信;TCP盡量保持數據交互,但不能保證交互可靠;UDP 實時信好,效率高,適用於對高速傳輸和實時性有較高的通信或廣播通信。
TCP 面向連接,點到點通訊,通訊前需要建立連接,也就是常說的3次握手;TCP傳送的數據,無差錯,不丟失,不重複,且按序到達,效率沒有UDP高,但它可靠;
UDP 佔用系統資源少,TCP佔用系統資源比較多。
由於網路的數據與穩定性的提升,網路的丟包率很低,在加上應用層重傳保證傳輸的可靠性,在越來越多的場景下優先考慮UDP。
二、創建UDP伺服器通訊端
UDP 不用建立連接,所以不像TCP一樣需要很多設置工作,伺服器端直接等待進來的連接就好了。
UDP服務端創建鏈接流程:
創建伺服器套接字(ss = socket())
↓
綁定伺服器套接字(ss.bind())
↓
伺服器無限循環(inf_loop:)
↓
對話(接收與發送)(cs = ss.recvfrom()/ss.sendto())
↓
關閉伺服器套接字(ss.close())(可選)
示例:創建一個能接收客戶的消息,在消息前加一個時間戳後返回的UDP伺服器。
udp_socket_server.py
from socket import *
from time import ctime
HOST =
PORT = 8080
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpSerrverSocket=socket(AF_INET,SOCK_DGRAM) # 創建UDP連接
udpSerrverSocket.bind(ADDR) # 綁定伺服器地址
while True: # 伺服器無線循環
print(等待連接...)
data,addr=udpSerrverSocket.recvfrom(BUFSIZ) # 接受客戶的連接
udpSerrverSocket.sendto(bytes([%s] %s % (ctime(), data),encoding=utf-8), addr) # 發送UDP 數據
print( 連接地址:, addr)
udpSerrverSocket.close() # 關閉伺服器連接
三、創建UDP客戶機通訊端
客服端創建鏈接流程:
創建客戶套接字(ss = socket())
↓
通訊循環(comm_loop:)
↓
對話(接收與發送)(cs.sendto()/cs.recvfrom())
↓
關閉客戶套接字(cs.close())
示例:與前面udp_socket_server.py 進行通訊
udp_socket_client.py
from socket import *
HOST = 127.0.0.1 # 伺服器連接地址
PORT = 8080 # 伺服器啟用埠
BUFSIZ = 1024 # 緩衝區大小
ADDR = (HOST, PORT)
udpCliendSocket = socket(AF_INET, SOCK_DGRAM)
while True:
data = bytes(input(> ), encoding="UTF-8")
if not data:
break
udpCliendSocket.sendto(data, ADDR)
data, ADDR = udpCliendSocket.recvfrom(BUFSIZ)
if not data:
break
print (data)
udpCliendSocket.close()
五、運行客戶端與伺服器程序
- 先運行伺服器端程序 (win系統 cmd 窗口命令 python socket_server.py )。
- 再運行客戶端程序 (win系統 重新開 cmd 窗口 命令 python socket_client.py )。
- 在客戶端程序輸入內容 Hi woodman 。
服務端輸出內容:
等待連接...
連接地址: (127.0.0.1, 51105)等待連接...
客戶端輸出內容:
b"[Mon Nov 12 09:52:19 2018] bHi woodman"
伺服器與客戶端通訊流程
- 伺服器啟動埠監聽,監聽埠數據報文。
- 當客戶端發送報文數據,(報文包含客戶端ip埠,伺服器ip埠,需發送的數據)
- 在客戶端接受服務的時候,伺服器又回去等待其它客戶端的數據報文。
- 伺服器對接收數據並進行處理,將返回數據封裝發送到客戶端。
推薦閱讀: