UDP 用戶數據報協議(User Datagram Protocol),是一個無連接的簡單的面向數據報的運輸層協議。 UDP不提供可靠性,它只是把應用程式傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。 由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故 ...
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 socket
PORT = 9002
server_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()))
PS:遇到問題沒人解答?需要Python學習資料?可以加點擊下方鏈接自行獲取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76
3.udp客戶端接受一次數據
import socket
client_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 socket
client_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 socket
PORT = 8000
server_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("接收到了客戶端d %s 傳來的數據: %s" % (client_address, receive_data.decode()))
server_socket.sendto(receive_data, client_address)
6.udp客戶端迴圈多次接受發送數據
import socket
client_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()))