1. 程式人生 > >標號(6):python(就業階段)——網路UDP

標號(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()