菜鳥級入門,打開你的Python腳本和手機間的傳送門!
為什么選擇UDP
在選擇使用協(xié)議的時候,選擇UDP必須要謹慎。在網(wǎng)絡質量令人十分不滿意的環(huán)境下,UDP協(xié)議數(shù)據(jù)包丟失會比較嚴重。但是由于UDP的特性:它不屬于連接型協(xié)議,因而具有資源消耗小,處理速度快的優(yōu)點,所以通常音頻、視頻和普通數(shù)據(jù)在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協(xié)議。 ———摘自《百度百科》
在實際使用之中我們會發(fā)現(xiàn)UPD比TCP方便很多,UDP沒有TCP的握手、確認、重傳、擁塞控制等機制,發(fā)送數(shù)據(jù)之前不需要建立連接,方便快捷,對實時應用很有用。
準備工作
- 安裝Python 3
- 如果機器是64位的話就下載64位的,以后學習深度學,習人工智能之類的時候會用到,官網(wǎng)會默認給你x86的
- 安裝時勾選“Add Python to PATH”,以后也會方便很多
- 給你的設備設置一個靜態(tài)IP(防止自己寫好腳本,保存好文件以后,IP地址突然變了)
- 百度會給你很多種設置靜態(tài)IP的方法,這里就不一一詳述了
- 推薦在路由器里通過DHCP設置
- 在手機上安裝U型遙控器,并且連接同一個網(wǎng)絡
接收你的第一條UDP消息
Python 3 簡單接收代碼
復制代碼后使用需注意檢查格式和嵌套
from socket import * #導入我們要用到的庫
host = '' #監(jiān)聽所有端口
port = 123 #用來接收消息的端口
bufsize = 1024 #buf大小,暫時不管
addr = (host,port)
udpServer = socket(AF_INET,SOCK_DGRAM) #通訊類別,對這兩個參數(shù)感興趣的可以自己查一下,我后面也會介紹
udpServer.bind(addr)#開始監(jiān)聽
while 1: #死循環(huán)
data,addr = udpServer.recvfrom(bufsize) #接收data
data=data.decode() #收到的data是bytes類型這里編碼成utf8
if data == "exit": #收到exit以后關閉端口退出程序
udpServer.close() #不關閉端口的話這個端口在關閉idle以前再用不了了
print("已退出")
exit(0)
else:
print(data)
#if data==..... do .... 干你想干的
上面的代碼理論上可以在任何有網(wǎng)絡權限的Python3上執(zhí)行
如果不是通過接收exit消息來關閉程序的話可能會出現(xiàn)端口占用
提供一條Linux平臺的粗暴解決端口占用的方法
import os
os.system("sudo kill -9 $(lsof -ti udp:被占用的端口號)")
#這條代碼會直接關掉正使用這個端口的程序,即使你不知道占用它的程序是什么(可能需要安裝lsof)
運行寫好的腳本
然后打開我們的U型遙控器手機端
v1.2.7會話設置界面
第一行添我們剛剛寫好代碼的那臺設備的IP地址
*以Windows為例 快捷鍵 win+r 打開 cmd 命令窗口,輸入ipconfig,其中的IPv4地址就是我們需要的
*以Linux為例 終端輸入 ifconfig,返回結果 wlan0 里的 inet addr
第二行添剛剛代碼里的port(123)
第三行添用來在手機上接收消息的端口,暫時沒有人給我們發(fā)消息,先隨意添一個數(shù)字(四位數(shù))
下面顯示的手機當前的IP,記下這個ip我們后面要用
確認所有數(shù)據(jù)填寫無誤以后,退出編輯模式,像我們的設備上發(fā)送第一條消息吧!
執(zhí)行結果
Python 3 簡單發(fā)送代碼
from socket import *
host = '192.168.31.119' # 這是手機上剛剛顯示的那個灰色的ip
port = 9999 #接口選擇大于3位數(shù)的,填寫在手機端的第3欄
bufsize = 1024
addr = (host,port)
udpClient = socket(AF_INET,SOCK_DGRAM)
while 1:
data=input()#等待輸入要發(fā)送的消息(輸入完回車確認)
if data=="":
pass
else:
data = data.encode()
udpClient.sendto(data,addr)
print("send over")
上面的代碼理論上可以在任何有網(wǎng)絡權限的Python3上執(zhí)行
*實際使用時可以把發(fā)送部分定義成函數(shù),在不方便使用顯示器獲取輸出結果時直接將輸出結果發(fā)送到手機
02.jpg