實現UDP套接字程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》
阿新 • • 發佈:2019-01-23
1. 首先介紹一下網路應用程式。主要有兩類: 一類是實現“在協議標準(RFC或其他標準文件)中所定義的操作”,是開放的網路應用程式,開發者必須遵守協議所規定的規則。因此,不同開發者開發的程式能夠互動操作(這些程式需要使用與該協議關聯的周知埠號); 另一類是專用的網路應用程式。這種程式所使用的應用層協議沒有公開發布,其他獨立的開發者將不能開發出與該程式互動的程式碼(這類程式應避免使用周知埠號)。
應該注意的是,如果是用IDLE執行這兩個程式的話,應注意為他們各自開啟一個程序(即開啟兩個IDLE):先讓伺服器程式保持執行狀態,然後執行客戶程式。
2. UDP應用程式
(1)UDP是無連線的,從一個端系統向另一個端系統傳送獨立的資料分組,不對交付提供任何保證。
(2)如下圖所示,使用UDP的兩個通訊程序之間的互動有以下幾個過程:
①傳送程序將目的地址附在資料分組之上(目的地址=目的主機IP+目的套接字所在的埠號)【分組上面的源地址由底層作業系統自動填寫】
②因特網使用該目的地址為該分組選路到目的程序的套接字;
③接收程序通過該套接字取回分組。
3. 用Python3 實現一個簡單的UDP應用程式
(1)應用程式的客戶端
#socket 模組形成了在python中所有網路通訊的基礎 from socket import * serverName='45.76.204.40' #包含伺服器的主機名或IP地址 serverPort=12000 #目標埠號 #使用socket()建立客戶套接字。 #第一個引數指示了地址簇:AF_INET指示了底層網路使用了IPv4 #第二個引數,SOCK_DGRAM指示了它是一個UDP套接字(而不是TCP套接字) #特別注意:我們無需指定客戶端套接字的埠號,這個工作由作業系統完成 clientSocket=socket(AF_INET,SOCK_DGRAM) message=input('Input lowercase sentence:') #提示使用者從鍵盤輸入,並將輸入讀取到message中 #sendto()為報文message附上目的地址(serverName,serverPort), #並向程序的套接字clientSocket傳送結果分組 clientSocket.sendto(message.encode(),(serverName,serverPort)) #來自因特網的分組到達該客戶的套接字時,其分組資料放在變數ModifiedMessage中,源地址放置在serverAddress中 #方法recvfrom取長度2048作為輸入 ModifiedMessage,serverAddress=clientSocket.recvfrom(2048) print (ModifiedMessage.decode()) clientSocket.close()
(2)然後是伺服器程式:
from socket import * serverPort=12000 serverSocket=socket(AF_INET,SOCK_DGRAM) serverSocket.bind(('',serverPort)) #將埠號與伺服器的套接字顯示繫結在一起 print('The server is ready to receive') #這個while允許伺服器無限期地接收來自客戶端的分組 while True: message,clientAddress=serverSocket.recvfrom(2048) modifiedMessage=message.upper() serverSocket.sendto(modifiedMessage,clientAddress)
應該注意的是,如果是用IDLE執行這兩個程式的話,應注意為他們各自開啟一個程序(即開啟兩個IDLE):先讓伺服器程式保持執行狀態,然後執行客戶程式。