標籤:建立 ima 開發 資料報 機制 class terminal arm while
UDP --- 使用者資料包通訊協定(User Datagram Protocol),是一個不需連線的簡單的面向資料報的運輸層協議。
UDP不提供可靠性,它只是把應用程式傳給IP層的資料報發送出去,但是並不能保證它們能到達目的地。
由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個串連,且沒有逾時重發等機制,故而傳輸速度很快。
開發環境:linux下pycharm3.5
測試:使用terminal終端測試
使用 nc -u ip 連接埠 進行測試用戶端
使用 nc -lu ip 連接埠 進行測試伺服器端
1.udp伺服器端接受一次資料
import socket# 設定伺服器預設連接埠號碼PORT = 9002# 建立一個通訊端socket對象,用於進行通訊# socket.AF_INET 指明使用INET地址集,進行網間通訊# socket.SOCK_DGRAM 指明使用資料協議,即使用傳輸層的udp協議server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)address = ("", PORT)# 為伺服器綁定一個固定的地址,ip和連接埠server_socket.bind(address)# 接收用戶端傳來的資料 recvfrom接收用戶端的資料,預設是阻塞的,直到有用戶端傳來資料# recvfrom 參數的意義,表示最大能接收多少資料,單位是位元組# recvfrom傳回值說明# receive_data表示接受到的傳來的資料,是bytes類型, receive_data.decode()解碼,將bytes類型轉換為字串類型# client_address 表示傳來資料的用戶端的身份資訊,用戶端的ip和連接埠,元組receive_data, client = server_socket.recvfrom(1024)print("來自用戶端%s,發送的%s" % (client, receive_data.decode()))# 不再接收資料的時候,將通訊端socket關閉server_socket.close()
測試:
2.udp服務端迴圈多次接受資料
import socketPORT = 9002server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)address = ("192.168.219.129", PORT)server_socket.bind(address)while True: receive_data, client_address = server_socket.recvfrom(1024) print("接收到了用戶端 %s 傳來的資料: %s" % (client_address, receive_data.decode()))
3.udp用戶端接受一次資料
import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)msg = input("請輸入要發送的內容:") # 字串類型, 通過msg.encode() 編碼 轉換為bytes類型server_address = ("127.0.0.1", 8000) # 接收方 伺服器的ip地址和連接埠號碼client_socket.sendto(msg.encode(), server_address)client_socket.close()
4.udp用戶端迴圈多次接受資料
import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True: msg = input("請輸入要發送的內容:") server_address = ("192.168.79.127", 8000) client_socket.sendto(msg.encode(), server_address)
5.udp伺服器端迴圈多次接受發送資料
import socketPORT = 8000server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)address = ("", PORT)server_socket.bind(address)while True: receive_data, client_address = server_socket.recvfrom(1024) print("接收到了用戶端 %s 傳來的資料: %s" % (client_address, receive_data.decode())) server_socket.sendto(receive_data, client_address)
6.udp用戶端迴圈多次接受發送資料
import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True: msg = input("請輸入要發送的內容:") server_address = ("", 8000) client_socket.sendto(msg.encode(), server_address) receive_data, sender_address = client_socket.recvfrom(1024) print("接受到了發送方 %s 傳來的資料: %s" % (sender_address, receive_data.decode()))
python網路編程之UDP方式傳輸資料