開發與維運

udp網絡程序

本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《Python入門2020最新大課》,主講人姜偉。

udp網絡程序

UDP協議
UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議。在通信開始之前,不需要建立相關的鏈接,只需要發送數據即可,類似於生活中,"寫信"。

不同電腦之間的通信需要使用socket
socket可以在不同的電腦間通信;還可以在同一個電腦的不同程序之間通信。

UDP通信模型

image.png

Udp發送數據

創建一個基於udp的網絡程序流程很簡單,具體步驟如下:

  • 創建客戶端套接字
  • 發送/接收數據
  • 關閉套接字
import socket

# 1. 創建socket,並連接
# AF_INET:表示這個socket是用來進行網絡連接
# SOCK_DGRAM:表示連接是一個 udp 連接
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 發送數據
# data:要發送的數據,它是二進制的數據
# address:發送給誰,參數是一個元組,元組裡有兩個元素
# 第0個表示目標的ip地址,第1個表示程序的端口號

# 給 192.168.31.199 這臺主機的 9000 端口上發送了 hello
# 端口號:0~65536  0~1024 不要用,系統一些重要的服務在使用
# 找一個空閒的端口號
s.sendto('下午好'.encode('utf8'), ('192.168.31.199', 9090))

# 3. 關閉socket
s.close()

Udp接收數據

import socket

# 創建一個基於 udp 的網絡socket連接
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 綁定端口號和ip地址
s.bind(('192.168.31.199', 9090))

# recvfrom 接收數據
# content = s.recvfrom(1024)
# print(content)
# 接收到的數據是一個元組,元組裡有兩個元素
# 第 0 個元素是接收到的數據,第 1 個元素是發送方的 ip地址和端口號

data, addr = s.recvfrom(1024)  # recvfrom是一個阻塞的方法,等待
print('從{}地址{}端口號接收到了消息,內容是:{}'.format(addr[0], addr[1], data.decode('utf8')))

s.close()

image.png

會變的端口號

重新運行多次腳本,然後在“網絡調試助手”中,看到的現象如下:
image.png
說明:
每重新運行一次網絡程序,上圖中紅圈中的數字,不一樣的原因在於,這個數字標識這個網絡程序,當重新運行時,如果沒有確定到底用哪個,系統默認會隨機分配。
記住一點:這個網絡程序在運行的過程中,這個就唯一標識這個程序,所以如果其他電腦上的網絡程序如果想要向此程序發送數據,那麼就需要向這個數字(即端口)標識的程序發送即可

UDP綁定信息

<1>. 綁定信息
一般情況下,在一臺電腦上運行的網絡程序有很多,為了不與其他的網絡程序佔用同一個端口號,往往在編程中,udp的端口號一般不綁定 但是如果需要做成一個服務器端的程序的話,是需要綁定的,想想看這又是為什麼呢? 如果報警電話每天都在變,想必世界就會亂了,所以一般服務性的程序,往往需要一個固定的端口號,這就是所謂的端口綁定。

<2>. 綁定示例

from socket import *

# 1. 創建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 綁定本地的相關信息,如果一個網絡程序不綁定,則系統會隨機分配
local_addr = ('', 7788) #  ip地址和端口號,ip一般不用寫,表示本機的任何一個ip
udp_socket.bind(local_addr)

# 3. 等待接收對方發送的數據
recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字節數

# 4. 顯示接收到的數據
print(recv_data[0].decode('gbk'))

# 5. 關閉套接字
udp_socket.close()

運行結果:
image.png
<3>.總結

  • 一個udp網絡程序,可以不綁定,此時操作系統會隨機進行分配一個端口,如果重新運行此程序端口可能會發生變化。
  • 一個udp網絡程序,也可以綁定信息(ip地址,端口號),如果綁定成功,那麼操作系統用這個端口號來進行區別收到的網絡數據是否是此進程的。

配套視頻

Leave a Reply

Your email address will not be published. Required fields are marked *