1. 程式人生 > >python高階學習日誌第一天之網路程式設計

python高階學習日誌第一天之網路程式設計

python高階學習日誌第一天之網路程式設計

UDP傳送資料

一個Java程式設計師,但是打算自學一下python,所以把自己學到的東西記錄在這裡。也免得我自己忘記新學的,年紀大了真的很容易忘東西。

哈哈,我喜歡邊寫程式邊聽歌

中國人民真蒸汽

這裡直接記錄的是我的實踐內容

首先是怎麼利用簡單的udp來發送資料?

這裡我用的編輯工具是== Pycharm ==
測試的工具是 == 網路除錯助手 ==
其中網路除錯助手有多種樣式的,下對了能用的就ok,我的就長這樣子:在這裡插入圖片描述
利用udp進行簡單的資料傳送有四個步驟

  1. 建立一個套接字
  2. 從鍵盤讀取你要傳送的資料
  3. 使用套接字傳送你的資料
  4. 關閉套接字

那麼在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接收資料?