網路程式設計之 Udp接收資料

ckxllf發表於2019-08-22

  udp接收資料,網路除錯助手擔任傳送方,但傳送時需要對方的也就是虛擬機器的ip 和埠,ip可以透過config獲取,那麼如何讓一個程式擁有一個固定埠呢?

  建立套接字的時候是沒有埠號的,好比買了手機沒有手機號,別人是找不到你的,所以要有一個固定的埠號,用udp_socket.bind()繫結一個埠

  接下來寫程式,終端中:

  vim 05 繫結埠用來接收資料.py

  寫程式的思路: if name==“main”:

  main()

  然後再def main():

  在這個函式里寫程式碼。

  用註釋來搭建流程

  #1、建立套接字

  #2、繫結一個本地資訊

  #3、接收資料

  #4、列印接收到的資料

  #5、關閉套接字

  流程搭建完之後開始寫程式碼,建立套接字的時候,用的是socket.XX,此時需要在程式碼的最上方匯入socekt,用到什麼導什麼,程式碼不是從第一行開始寫的。

  因為當程式碼比較多的時候,比如200多行,不確定會用到什麼,所以用到什麼匯入什麼,用到什麼再調什麼。

  1、udp繫結埠用來接收資料.py

  程式碼具體形式如下:

  import socket

  def main():

  #1、建立套接字

  udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  #2、繫結一個本地資訊(udp ctrl n自動補全),必須繫結自己電腦的ip port其它電腦的不行

  繫結的是一個元組,用localaddr變數表示,本地ip,繫結埠,埠號大於1024

  localaddr =("",7788)

  udp_socket.bind(localaddr)

  #3、接收資料(傳送資料是套接字.sendto 接收是套接字.recvfrom(1024),

  1024表示本次接收的最大位元組數),並用recv_data變數接收

  recv_data = udp_socket.recvfrom(1024)

  #4、列印接收到的資料

  print(recv_data)

  #5、關閉套接字

  udp_socket.close()

  if __name__=="__main__":

  main()

  程式碼完成後,終端中python3 05 繫結埠用來接收資料.py 執行程式,此時由網路除錯助手傳送過來的訊息就可以在終端中收到,收到的內容顯示情況如下:

  

在這裡插入圖片描述

  列印出來的資料即變數recv_data,是一個元組,第一個引數是傳送的資料,第二個引數是一個小元組,是傳送方的ip和埠。

  想要在終端中只顯示接收到的資料,不顯示對方的ip 和埠,操作如下:

  cp 05 繫結埠用來接收資料.py 06解析出接收到資料.py

  2、解析出接收到資料.py

  關於註釋:

  如果在一行的開頭註釋,直接用# 後面跟上一個空格 再寫註釋內容

  如果是在程式碼後面註釋 程式碼後面加兩個空格 再用# 跟上一個空格 再寫註釋內容

  列印程式碼調整時的思路:

  print(“s% : s%”,%(send_addr,recv_msg))

  但send_addr是一個元組,不能直接這樣用,需要用str(send_addr)來轉換

  recv_msg也不能直接用,因為傳送時是用編碼編成了bite型別,收到的也是bite型別,如果直接傳送過來的是字母,可以收到,但是如果傳送過來是漢字,收到的是亂碼,此時需要解碼,

  recv_msg.decode(“utf-8”),但是此時用windows的網路除錯助手傳送中文過來還是亂碼,因為windows不是用utf-8編碼的,用的是gbk編碼,所以此時解碼需要用gbk,即:recv_msg.decode(“gbk”)

  如果將網路除錯助手放到ubantu中,解碼還是要用utf-8來解

  import socket

  def main():

  #1、建立套接字

  udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  #2、繫結一個本地資訊

  localaddr =("",7788)

  udp_socket.bind(localaddr)

  #3、接收資料

  recv_data = udp_socket.recvfrom(1024)

  recv_msg = recv_data[0] # 用來接收傳送的內容

  send_addr = recv_data[1] # 用來接收傳送方的ip和port

  #4、列印接收到的資料

  #print(recv_data) # 此時列印的程式碼需要註釋掉,重新調整

  pint("s%:s%",%(str(send_addr),recv_msg.decode("gbk")))

  #5、關閉套接字

  udp_socket.close()

  if __name__=="__main__":

  main()

  **總結: 無錫婦科檢查醫院

  傳送資料步驟:

  1.建立套接字

  2.傳送資料

  3.關閉套接字

  接收資料步驟:

  1.建立套接字

  2.繫結本地的ip 埠

  3.接收資料

  4.列印套接字

  想要在終端中迴圈一直接收資料,操作如下:

  cp 06解析出接收到資料.py 07迴圈接收資料.py

  vim 07迴圈接收資料.py

  3、迴圈接收資料.py

  想要迴圈接收,就要用while true ,對接收和列印程式碼進行while true:

  ESC 大V 上下箭頭選中,大於號向右縮排

  import socket

  def main():

  #1、建立套接字

  udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  #2、繫結一個本地資訊

  localaddr =("",7788)

  udp_socket.bind(localaddr)

  #3、接收資料

  while True:

  recv_data = udp_socket.recvfrom(1024)

  recv_msg = recv_data[0] # 用來接收傳送的內容

  send_addr = recv_data[1] # 用來接收傳送方的ip和port

  #4、列印接收到的資料

  pint("s%:s%",%(str(send_addr),recv_msg.decode("gbk")))

  #5、關閉套接字

  udp_socket.close()

  if __name__=="__main__":

  main()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2654578/,如需轉載,請註明出處,否則將追究法律責任。

相關文章