網(wǎng)站開發(fā)客戶的思路總結(jié)整站優(yōu)化提升排名
文章目錄
- 版權(quán)聲明
- UDP網(wǎng)絡(luò)應(yīng)用程序開發(fā)
- UDP初識
- UDP知識要點
- socket類的使用
- UDP發(fā)送數(shù)據(jù)開發(fā)流程分析
- UDP服務(wù)客戶端通信栗子
- UDP廣播發(fā)送
版權(quán)聲明
- 本博客的內(nèi)容基于我個人學(xué)習(xí)黑馬程序員課程的學(xué)習(xí)筆記整理而成。我特此聲明,所有版權(quán)屬于黑馬程序員或相關(guān)權(quán)利人所有。本博客的目的僅為個人學(xué)習(xí)和交流之用,并非商業(yè)用途。
- 我在整理學(xué)習(xí)筆記的過程中盡力確保準(zhǔn)確性,但無法保證內(nèi)容的完整性和時效性。本博客的內(nèi)容可能會隨著時間的推移而過時或需要更新。
- 若您是黑馬程序員或相關(guān)權(quán)利人,如有任何侵犯版權(quán)的地方,請您及時聯(lián)系我,我將立即予以刪除或進行必要的修改。
- 對于其他讀者,請在閱讀本博客內(nèi)容時保持遵守相關(guān)法律法規(guī)和道德準(zhǔn)則,謹慎參考,并自行承擔(dān)因此產(chǎn)生的風(fēng)險和責(zé)任。本博客中的部分觀點和意見僅代表我個人,不代表黑馬程序員的立場。
UDP網(wǎng)絡(luò)應(yīng)用程序開發(fā)
UDP初識
- UDP(User Datagram Protocol)是一種無連接的傳輸層協(xié)議,它不保證數(shù)據(jù)傳輸?shù)目煽啃院陀行蛐?#xff0c;但具有傳輸速度快的優(yōu)點。
- UDP協(xié)議可以用于音頻、視頻、游戲等實時應(yīng)用場景,因為這些應(yīng)用對數(shù)據(jù)傳輸?shù)膶崟r性要求較高,而對數(shù)據(jù)傳輸?shù)目煽啃院陀行蛐砸筝^低。
- UDP通信的優(yōu)點是速度快,適用于實時應(yīng)用場景,但缺點是不可靠,容易丟失數(shù)據(jù),因此在需要保證數(shù)據(jù)傳輸可靠性的場景下不適用。
UDP通信的基本流程如下:
-
發(fā)送端將要發(fā)送的數(shù)據(jù)打包成UDP數(shù)據(jù)包,包括目標(biāo)IP地址、目標(biāo)端口號、數(shù)據(jù)長度和數(shù)據(jù)內(nèi)容等信息。
-
發(fā)送端將UDP數(shù)據(jù)包發(fā)送給目標(biāo)主機。
-
接收端接收到UDP數(shù)據(jù)包后,將數(shù)據(jù)包中的信息解析出來,包括發(fā)送端IP地址、發(fā)送端端口號、數(shù)據(jù)長度和數(shù)據(jù)內(nèi)容等信息。
-
接收端根據(jù)發(fā)送端的IP地址和端口號,將數(shù)據(jù)傳輸?shù)较鄳?yīng)的應(yīng)用程序中進行處理。
UDP知識要點
- UDP網(wǎng)絡(luò)通信本質(zhì)不區(qū)分客戶端和服務(wù)端,在實際應(yīng)用中,通常會將發(fā)送數(shù)據(jù)的一方稱為客戶端,將接收數(shù)據(jù)的一方稱為服務(wù)端。
- 在實際應(yīng)用中,客戶端通常是發(fā)送請求的一方,服務(wù)端通常是提供服務(wù)的一方。例如,在客戶端與服務(wù)端之間進行網(wǎng)絡(luò)游戲通信時,客戶端會向服務(wù)端發(fā)送游戲請求,服務(wù)端會接收請求并處理,然后再將處理結(jié)果發(fā)送回客戶端。在這種情況下,客戶端和服務(wù)端的角色是明確的。
- UDP協(xié)議可以直接通過對方IP地址和端口號發(fā)送數(shù)據(jù),而不需要像TCP協(xié)議那樣需要先建立連接。
- 在UDP協(xié)議中,發(fā)送數(shù)據(jù)時需要指定目標(biāo)主機的IP地址和端口號,數(shù)據(jù)直接發(fā)送到目標(biāo)主機。接收數(shù)據(jù)時,可以通過綁定本地IP地址和端口號來指定接收數(shù)據(jù)的地址和端口號,然后等待數(shù)據(jù)的到來。當(dāng)有數(shù)據(jù)到達時,就可以直接從數(shù)據(jù)包中獲取發(fā)送方的IP地址和端口號,從而實現(xiàn)直接通信。
- 在UDP協(xié)議中,可以指定一個固定的端口用于發(fā)送和接收數(shù)據(jù),也可以讓操作系統(tǒng)自動選擇一個空閑端口。
- 在發(fā)送UDP數(shù)據(jù)時,可以指定源端口和目標(biāo)端口。如果指定了源端口,那么每次發(fā)送數(shù)據(jù)時就會使用該端口。如果未指定源端口,操作系統(tǒng)會自動選擇一個空閑端口,然后發(fā)送數(shù)據(jù)。在接收UDP數(shù)據(jù)時,可以指定一個固定的端口來接收數(shù)據(jù)。如果未指定端口,操作系統(tǒng)會自動選擇一個空閑端口來接收數(shù)據(jù)。
socket類的使用
- 參看python之TCP的網(wǎng)絡(luò)應(yīng)用程序開發(fā)的socket類的使用部分的內(nèi)容
- 栗子
- 創(chuàng)建UDP套接字對象:
import socket# 創(chuàng)建UDP套接字對象 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- 綁定本地IP地址和端口號:
# 綁定本地IP地址和端口號 local_addr = ('127.0.0.1', 8888) udp_socket.bind(local_addr)
- 發(fā)送UDP數(shù)據(jù):
# 發(fā)送UDP數(shù)據(jù) dest_addr = ('127.0.0.1', 9999) send_data = 'Hello, UDP!' udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
- 接收UDP數(shù)據(jù):
# 接收UDP數(shù)據(jù) recv_data, remote_addr = udp_socket.recvfrom(1024) print('Received from %s:%s' % remote_addr) print(recv_data.decode('utf-8'))
- 關(guān)閉UDP套接字對象:
# 關(guān)閉UDP套接字對象 udp_socket.close()
UDP發(fā)送數(shù)據(jù)開發(fā)流程分析
- 服務(wù)端:
- 創(chuàng)建UDP套接字對象
- 綁定本地IP地址和端口號
- 接收UDP數(shù)據(jù)
- 發(fā)送UDP數(shù)據(jù)
- 關(guān)閉UDP套接字對象
- 客戶端:
- 創(chuàng)建UDP套接字對象
- 發(fā)送UDP數(shù)據(jù)
- 接收UDP數(shù)據(jù)
- 關(guān)閉UDP套接字對象
UDP服務(wù)客戶端通信栗子
- UDP服務(wù)端
import socketif __name__ == '__main__':# 創(chuàng)建UDP套接字對象udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設(shè)置為非阻塞模式udp_socket.setblocking(False)# 綁定本地IP地址和端口號local_addr = ('127.0.0.1', 8888)udp_socket.bind(local_addr)while True:try:# 接收UDP數(shù)據(jù)recv_data, remote_addr = udp_socket.recvfrom(1024)print('Received from %s:%s' % remote_addr)print(recv_data.decode('utf-8'))# 發(fā)送UDP數(shù)據(jù)send_data = 'Hello, UDP客戶端!'udp_socket.sendto(send_data.encode('utf-8'), remote_addr)except BlockingIOError:pass# 發(fā)送UDP數(shù)據(jù)send_data = 'Hello, UDP客戶端!'udp_socket.sendto(send_data.encode('utf-8'), remote_addr)# 關(guān)閉UDP套接字對象udp_socket.close()
- UDP客戶端
import socket
if __name__ == '__main__':# 創(chuàng)建UDP套接字對象udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設(shè)置為非阻塞模式udp_socket.setblocking(False)# 發(fā)送UDP數(shù)據(jù)dest_addr = ('127.0.0.1', 8888)send_data = 'Hello, UDP服務(wù)端!'udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 接收UDP數(shù)據(jù)while True:try:recv_data, remote_addr = udp_socket.recvfrom(1024)print('Received from %s:%s' % remote_addr)print(recv_data.decode('utf-8'))breakexcept BlockingIOError:pass# 關(guān)閉UDP套接字對象udp_socket.close()
UDP廣播發(fā)送
-
廣播地址(Broadcast Address)是專門用于同時向網(wǎng)絡(luò)中所有工作站進行發(fā)送的一個地址
-
廣播地址是一個特殊的IP地址,用于向一個網(wǎng)絡(luò)中的所有設(shè)備發(fā)送數(shù)據(jù)。在IPv4中,廣播地址是由主機地址全為1和網(wǎng)絡(luò)地址組成的地址。例如,如果你的網(wǎng)絡(luò)地址是192.168.1.0,那么廣播地址就是192.168.1.255。
import socketif __name__ == '__main__':# 創(chuàng)建UDP套接字對象 將UDP套接字對象設(shè)置為廣播模式udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 設(shè)置廣播選項 socket.SO_BROADCAST廣播udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)# 廣播地址dest_addr = ('192.168.1.255', 8888)# 發(fā)送UDP數(shù)據(jù)send_data = 'Hello, UDP broadcast!'udp_socket.sendto(send_data.encode('utf-8'), dest_addr)# 關(guān)閉UDP套接字對象udp_socket.close()