Python網路程式設計——IP、UDP

TechLee發表於2018-06-19

Python網路程式設計 —— IP、UDP

IP

ip地址: 在網路中標識一臺唯一的裝置

ip地址的作用: 通過ip地址在網路中找到對應的裝置,然後可以給這個裝置傳送資料

ip地址分為:ipv4 ipv6

域名:方便記憶某臺電腦的主機地址,域名能解析出來一個ip地址(DNS解析)

ping 127.0.0.1 能ping通即代表電腦網路卡沒有問題,網路正常就能上網

網路通訊流程:
通過ip地址找到對應的裝置(電腦,手機等),然後通過埠號找到埠,再通過埠給應用程式傳送資料

埠號分為知名埠號和動態埠號(知名埠號是系統使用的,動態埠號是程式設計師設定使用的)

知名埠號:範圍從0-1023

動態埠範圍:1024-65535 ,當程式關閉時,同時也就釋放了所佔用的埠號

檢視埠號:netstat -an

檢視埠號被哪個程式佔用: lsof -i[tcp/udp]:埠號 (找不到時,使用管理員許可權,加sudo)

根據程式編號殺死指定程式:kill -9 程式號

UDP

概念:英文全拼(User Datagram Protocol)簡稱使用者資料包協議,它是無連線的、不可靠的網路傳輸協議

面向無連線型:無需確認對端是否存在,傳送端可隨時傳送資料(udp網路傳輸協議好比現實生活中寫信)

UDP特點:

無連線、資源開銷小、傳輸速度快、UDP每個資料包最大是64K

UDP優點:

傳輸速度快

不需要連線,資源開銷小

UDP缺點:

傳輸資料不可靠,容易丟失資料包

沒有流量控制,當對方沒有及時接收資料,傳送方一直髮送資料會導致緩衝區資料滿了,電腦出現卡死情況,所以接收方需要及時接收資料

socket

程式:執行的程式或者軟體稱之為程式

程式通訊:執行的程式之間的資料共享

socket:簡稱:套接字,是程式間通訊的一個工具,它能實現把資料從一方傳輸到另外一方,完成不同電腦上程式之間的通訊

使用場景:只要和網路相關,幾乎都需要使用socket

UDP網路程式

UDP網路程式流程

1.建立socket套接字

2.傳送/接收資料

3.關閉套接字

建立socket 傳送資料

在Python中使用socket模組的函式socket

import socket

# 判斷是否是主模組,判斷是否是程式入口
if __name__ == "__main__":
    # 建立UDP套接字
    # 1. ip地址的型別:AF_INET: ipv4, AF_INET6: ipv6
    # 2. 傳輸協議型別:SOCK_DGRAM:udp協議
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # 準備資料
    send_content = "學習socket,很開心"

    # 把字串編碼成為二進位制資料
    send_data = send_content.encode("utf-8")

    # 傳送資料
    udp_socket.sendto(send_data,(`192.168.138.50`,8080))

    # 關閉套接字
    udp_socket.close()

建立socket 接收資料
import socket
if __name__ == "__main__":
    # 建立udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # 準備傳送的資料
    send_content = "測試測試"

    # 對資料進行編碼,把字串轉成對應的二進位制資料
    send_data = send_content.encode("gbk")

    # 傳送資料
    udp_socket.sendto(sned_data,("192.168.138.50", 8080))

    # 接受資料,1024表示:每次接收資料的最大位元組數
    recv_data, ip_port = udp_socket.recvfrom(1024)
    

    # 對二進位制資料進行解碼
    # sep : 指定資料的分隔符
    recv_content = recv_data.decode("gbk")
    print(recv_content, ip_port, sep="&")

    # 關閉
    udp_socket.close()
udp繫結埠號

udp 繫結資訊:一般情況下,在一臺電腦上執行的網路程式有很多,為了不與其他的網路程式佔用同一個埠號,往往在程式設計中,udp的埠號一般不繫結

但是如果需要做成一個服務端的程式的話,是需要繫結的

繫結埠號:

import socket


if __name__ == "__main__":
    # 建立udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # 繫結埠號, "" : 表示本機的任意IP地址,可以解決電腦上多個網路卡都能收到資料
    udp_socket.bind("", 9090)

    # 傳送資料
    udp_socket.sendto("哈哈".encode("gbk"),("192.168.138.50", 8080))

    # 接收資料
    recv_data, ip_port = udp_socket.recvfrom(1024)

    # 把二進位制資料進行解碼
    recv_content = recv_data.decode("gbk")
    print(recv_content, ip_port)
    
    # 關閉套接字
    udp_socket.close()
UDP 傳送廣播訊息
import socket


if __name__ == "__main__":
    # 建立udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 1.SQL_SOCKET:當前套接字
    # 2.SO_BROADCAST :廣播選項
    # 3.True :是否開啟廣播選項
    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
    # 傳送資料
    udp_socket.sendto("你好".encode("gbk"), ("192.168.138.50", 8989))

    # 關閉套接字
udp 聊天器

需求:

在一個電腦中編寫一個程式,有兩個功能

1.獲取鍵盤資料,並將其傳送給對方

2.接受資料並顯示

import socket


if __name__ == "__main__":
    # 建立udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 接收使用者的功能選項
    menu_option = input("請輸入功能選項 1.傳送資料 2.接收資料 3.退出:")

    while True:
        if menu_option == "1":

            # 獲取使用者傳送的資料
            send_content = input("請求輸入您要傳送的資料:")
            
            # 獲取對方的IP地址
            dest_ip = input("請輸入對方的ip地址:")
            
            # 獲取對方的埠號
            dest_port = input("請輸入對方的埠號:")
            
            # 把字串進行gbk編碼
            send_data = send_content.encode("gbk")

            # 傳送資料
            udp_socket.sendto(send_data,(dest_ip,int(dest_port)))

        elif menu_option == "2":

            # 接收資料
            recv_data, ip_port = udp_socket.recvfrom(1024)

            # 對二進位制資料進行解碼
            recv_content = recv_data.decode("gbk")
            print(recv_content, ip_port)

        elif menu_option == "3":
            break

        else:
            print("請按提示操作!")

    # 關閉套接字
    udp_socket.close()

歡迎訪問

個人部落格地址:www.limiao.tech



相關文章