1. 程式人生 > >實現UDP套接字程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》

實現UDP套接字程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》

1. 首先介紹一下網路應用程式。主要有兩類:        一類是實現“在協議標準(RFC或其他標準文件)中所定義的操作”,是開放的網路應用程式,開發者必須遵守協議所規定的規則。因此,不同開發者開發的程式能夠互動操作(這些程式需要使用與該協議關聯的周知埠號);        另一類是專用的網路應用程式。這種程式所使用的應用層協議沒有公開發布,其他獨立的開發者將不能開發出與該程式互動的程式碼(這類程式應避免使用周知埠號)。

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):先讓伺服器程式保持執行狀態,然後執行客戶程式。