python高階學習日誌第一天之網路程式設計
python高階學習日誌第一天之網路程式設計
UDP傳送資料
一個Java程式設計師,但是打算自學一下python,所以把自己學到的東西記錄在這裡。也免得我自己忘記新學的,年紀大了真的很容易忘東西。
哈哈,我喜歡邊寫程式邊聽歌
中國人民真蒸汽
這裡直接記錄的是我的實踐內容
首先是怎麼利用簡單的udp來發送資料?
這裡我用的編輯工具是== Pycharm ==
測試的工具是 == 網路除錯助手 ==
其中網路除錯助手有多種樣式的,下對了能用的就ok,我的就長這樣子:
利用udp進行簡單的資料傳送有四個步驟
- 建立一個套接字
- 從鍵盤讀取你要傳送的資料
- 使用套接字傳送你的資料
- 關閉套接字
那麼在python中要用到套接字,就像java導包一樣也需要匯入其中的套接字使用模組,使用Pycharm會自動提示不勸匯入,真滴是特別的方便了。
接著在最後的位置給python設定一個啟動器(main方法),類似,java裡的
public static void main(String[] args){}
python裡的寫法是main方法:
if __name__ == '__main__':
在這個main函式縮排的位置上寫上要執行的函式名就ok
按照剛剛說的流程走一遍:
#引入套接字使用模組
import socket
#自定義一個方法叫做main(),方法名隨意
def main():
#1.建立一個套接字,叫做udp_socket,固定的建立寫法
#其中SOCK_DGRAM是代表基於udp的套接字,無保障的
udp_socket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2.從鍵盤讀取輸入資料,賦值給send_data變數
send_data = input("請輸入要傳送的資料:")
#3.使用套接字傳送資料
#udp_socket套接字已經建立,用其自帶的方法即可以實現傳送,並且把傳送的資料編碼,防止中文輸入亂碼
udp_socket.sendto(send_data.encode("gbk"), ("10.128.246.239", 6666))
#4.關閉套接字
udp_socket.close()
#在main方法裡執行main()函式
if __name__ == '__main__':
main()
ok,這是一個簡單的流程,其中 10.128.246.239 和 6666 分別是要接受資料方的ip地址和埠號,接收方也是一個udp,只不過這個udp用來接收資料,在這裡用網路除錯助手來模擬接收資料的udp方。
注意:套接字的sendto方法需要帶兩個引數,第一個是傳送的資料,是byte型別的,第二個引數是一個元組,類似java裡的陣列,(ip地址,埠號),ip地址是字串型別的,埠號是整型的。
接下來用網路除錯助手模擬資料接收方,開啟網路除錯助手,如下
新建一個udp
其中ip地址換成當前聯網的ip,window下可以用win+R,輸入cmd開啟命令模式輸入ipconfig即可檢視當前網路的ip
把這個ip地址輸入到網路除錯助手的設定區的本地ip位置,當然助手也能自動捕獲,如圖,用上這個就行
然後設定一個埠號,自己設定就行了,大於1024小於65535就行,排除電腦上有程式在用這個埠以外。啟動,最終如下圖,
這個時候通過程式碼裡的引數配置,已經可以連線上這個接收器了,執行python程式
點綠色按鈕選擇執行即可,執行如圖:
然後輸入資料測試傳送,輸入後回車。
這個時候回到網路除錯助手可以看到:
來自本機地址,因為是自己發給自己測試,這個埠發來的這個資料。
這個時候開始想,能不能迴圈輸入資料傳送?
答案是可以的,把傳送資料執行的程式碼片作為迴圈體即可。然後可以簡單地設定一下,當用戶輸入“exit”的時候,讓使用者結束髮送。
然後程式碼變成了這樣,把從鍵盤獲取資料到傳送資料作為迴圈體。用while True: 圈起來,也就是把迴圈體一段縮排,相當於java中的{}大括號。然後用if判斷使用者輸入的是不是exit字串,是的話,則跳出迴圈,直接執行關閉套接字操作,程式執行結束。
import socket
def main():
# 建立一個udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
# 從鍵盤獲取資料
send_data = input("請輸入要傳送的資料:")
# 如果輸入的資料是exit。則推出程式
if send_data == "exit":
break
# 使用套接字傳送資料
udp_socket.sendto(send_data.encode("gbk"), ("10.128.246.239", 6666))
# 關閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
注意,if裡也用了縮排,就相當於java的{}
執行程式:
這個時候,可以迴圈傳送資料。開啟網路除錯助手:
它也迴圈收到了資料
如果輸入“exit”
退出程式,結束髮送。
這裡我們可能會注意到這個細節
有兩種埠,這個是因為程式碼運行了兩次,每次執行都由作業系統隨機分配埠,總而言之,一個應用程式需要執行,則需要一個埠,當然在程式碼裡也可以繫結埠,套接字繫結埠的操作會在udp接收資料裡記錄。
小白新學python之網路程式設計入門,大神勿噴
下一次記錄
怎麼利用udp接收資料?