天天看點

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

1. 首先介紹一下網絡應用程式。主要有兩類:         一類是實作“在協定标準(RFC或其他标準文檔)中所定義的操作”,是開放的網絡應用程式,開發者必須遵守協定所規定的規則。是以,不同開發者開發的程式能夠互動操作(這些程式需要使用與該協定關聯的周知端口号);         另一類是專用的網絡應用程式。這種程式所使用的應用層協定沒有公開釋出,其他獨立的開發者将不能開發出與該程式互動的代碼(這類程式應避免使用周知端口号)。

2. UDP應用程式

(1)UDP是無連接配接的,從一個端系統向另一個端系統發送獨立的資料分組,不對傳遞提供任何保證。

(2)如下圖所示,使用UDP的兩個通信程序之間的互動有以下幾個過程:

①發送程序将目的位址附在資料分組之上(目的位址=目的主機IP+目的套接字所在的端口号)【分組上面的源位址由底層作業系統自動填寫】

②網際網路使用該目的位址為該分組選路到目的程序的套接字;

③接收程序通過該套接字取回分組。

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

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

繼續閱讀