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