上一篇: 端口号和套接字 | 手把手教你入門Python之九十五 下一篇: TCP協定 | 手把手教你入門Python之九十七 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。
udp網絡程式
UDP協定
UDP 是User Datagram Protocol的簡稱, 中文名是使用者資料報協定。在通信開始之前,不需要建立相關的連結,隻需要發送資料即可,類似于生活中,"寫信"。
不同電腦之間的通信需要使用socket
socket可以在不同的電腦間通信;還可以在同一個電腦的不同程式之間通信。
UDP通信模型
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()
會變的端口号
重新運作多次腳本,然後在“網絡調試助手”中,看到的現象如下:
說明:
每重新運作一次網絡程式,上圖中紅圈中的數字,不一樣的原因在于,這個數字辨別這個網絡程式,當重新運作時,如果沒有确定到底用哪個,系統預設會随機配置設定。
記住一點:這個網絡程式在運作的過程中,這個就唯一辨別這個程式,是以如果其他電腦上的網絡程式如果想要向此程式發送資料,那麼就需要向這個數字(即端口)辨別的程式發送即可
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()
運作結果:
<3>.總結
- 一個udp網絡程式,可以不綁定,此時作業系統會随機進行配置設定一個端口,如果重新運作此程式端口可能會發生變化。
- 一個udp網絡程式,也可以綁定資訊(ip位址,端口号),如果綁定成功,那麼作業系統用這個端口号來進行差別收到的網絡資料是否是此程序的。