標號(6):python(就業階段)——網路UDP
<1>UDP含義:
英文全拼(User Datagram Protocol)簡稱使用者資料報協議,它是無連線的、不可靠的網路傳輸協議
<2>UDP特點:
無連線、資源開銷小(udp每個資料包最大是64K)、傳輸速度快、沒有超時重發機制。
<3>UDP的優缺點:
(1)優點:傳輸速度快、不需要連線,資源開銷小
(2)缺點:傳輸資料不可靠,容易丟資料包、沒有流量控制。(當對方沒有及時接收資料,傳送方一直髮送資料會導致緩衝區資料滿了,電腦出現卡死情況,所有接收方需要及時接收資料。)
<4>socket介紹
1、socket的概念:
(套接字)不同程序之間進行通訊的工具,將資料從一方傳到另一方,完成資料傳輸
2、udp網路程式流程
(1)建立客戶端套接字 import socket —> soc = socket.socket(AddressFamily, Type)
1、Address Family:IP地址型別; AF_INET表示ipv4型別、AF_INET6表示ipv6型別;
2、Type:套接字型別,可以是 SOCK_STREAM(TCP 協議)或者 SOCK_DGRAM(用UDP 協議)
(2)傳送/接收資料
1、傳送資料 soc.sendto(send_data,(ip,port))
2、收發資料 soc.recvfrom(1024) ps:1024表示本次接收的最大位元組數。
3、Windows使用的是gbk編碼
4、Linux使用的是utf-8編碼
說明:一個udp網路程式,不繫結埠號,此時作業系統會隨機分配一個埠號,如果繫結埠號,每次啟動程式埠號不變。如果需要做成一個伺服器端的程式的話,是需要繫結的
(3)關閉套接字 soc.close()
3、資料編碼和解碼
(1)str->bytes:encode編碼 str.encode(encoding=“utf-8”, errors=“strict”)
(2)bytes->str:decode解碼 bytes.decode(encoding=“utf-8”, errors=“strict”)
說明:
1> strict:表示嚴格按照指定編解碼方式進行編碼和解碼,如果編解碼不成功則崩潰
2> ignore:表示忽略編解碼不成功的字元,如果編解碼不成功程式不會崩潰
4、UDP傳送廣播訊息
(1)廣播地址最常用的是255.255.255.255
(2)設定socket的選項,允許傳送廣播訊息:
格式:udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
說明:
1> socket.SOL_SOCKET -> 表示當前套接字
2> socket.SO_BROADCAST -> 表示套接字廣播選項
*<5>udp網路程式-傳送、接收資料——示例程式碼
import socket
# 1. 建立udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 準備接收方的地址
dest_addr = ('192.168.236.129', 8080)
# 3. 從鍵盤獲取資料
send_data = input("請輸入要傳送的資料:")
# 4. 傳送資料到指定的電腦上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 等待接收對方傳送的資料
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大位元組數
# 6. 顯示對方傳送的資料
# 接收到的資料recv_data是一個元組
# 第1個元素是對方傳送的資料
# 第2個元素是對方的ip和埠
print(recv_data[0].decode('gbk'))
print(recv_data[1])
# 7. 關閉套接字
udp_socket.close()
<6>傳送廣播訊息——示例程式碼
import socket
if __name__ == '__main__':
# 建立udpsocket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 設定socket的選項,允許傳送廣播訊息
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 傳送廣播訊息
udp_socket.sendto("大家好,我叫小郭同學,多多關照!".encode("gbk"), ("255.255.255.255", 9090))
# 關閉socket
udp_socket.close()
<7>udp聊天器——示例程式碼
import socket
def send_msg(udp_socket):
"""獲取鍵盤資料,並將其傳送給對方"""
# 1. 從鍵盤輸入資料
msg = input("\n請輸入要傳送的資料:")
# 2. 輸入對方的ip地址
dest_ip = input("\n請輸入對方的ip地址:")
# 3. 輸入對方的port
dest_port = int(input("\n請輸入對方的port:"))
# 4. 傳送資料
udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收資料並顯示"""
# 1. 接收資料
recv_msg = udp_socket.recvfrom(1024)
# 2. 解碼
recv_ip = recv_msg[1]
recv_msg = recv_msg[0].decode("utf-8")
# 3. 顯示接收到的資料
print(">>>%s:%s" % (str(recv_ip), recv_msg))
def main():
# 1. 建立套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 繫結本地資訊
udp_socket.bind(("", 7890))
while True:
# 3. 選擇功能
print("="*30)
print("1:傳送訊息")
print("2:接收訊息")
print("="*30)
op_num = input("請輸入要操作的功能序號:")
# 4. 根據選擇呼叫相應的函式
if op_num == "1":
send_msg(udp_socket)
elif op_num == "2":
recv_msg(udp_socket)
else:
print("輸入有誤,請重新輸入...")
if __name__ == "__main__":
main()