本節內容如下什么是UDP協議UDP網絡編程——服務端程序開發UDP網絡編程——客戶端程序開發1 什么是UDP協議回顧TCP協議:一個非常重要的數據
回顧TCP協議:一個非常重要的數據傳輸協議,很多網絡協議都是以TCP協議為基礎的;TCP協議要求服務器和客戶端通過三次握手交互的方式建立可靠的連接,然后再進行數據保溫的發送,在發送過程中保證數據包的順序和數量不會丟失,最后如果要斷開連接需要四次揮手的方式進行連接的安全斷開。
UDP協議:是一種用戶數據報協議,是一種非連接的協議,傳輸數據之前服務端和客戶端之間不建立連接,當進行數據傳送時就將應用程序中的數據提取出來并放在網絡上;
發送端發送數據,只是收到當前應用程序生成數據的速度、計算能力和傳輸帶寬等因素的影響
接收端接收數據,UDP將消息放在一個消息隊列中,應用程序從消息隊列中讀取消息
UDP特性:
1、傳輸數據不建立連接,不需要維護連接狀態,同一個服務端可以向多個客戶端廣播發送消息
2、UDP數據包標題8個字節,TCP需要20個字節,額外開銷較小
3、UDP是不可靠的傳輸協議,不保證所有的數據接收端完整并且正確的接收
4、UDP協議是面向報文的,發送端UDP直接將程序中的數據封裝成報文交給IP層進行傳輸,所以需要我們在程序中處理好報文數據的大小
關于TCP和UDP那點事兒
1、基于連接和非連接的
2、對系統資源的消耗多和少
3、TCP程序結構復雜、UDP程序結構簡單明了
4、數據流模式的數據和數據報模式的數據
5、TCP是可靠的傳輸協議,UDP是不可靠的傳輸協議
socket(family, type):用于表示網絡連接的socket對象
family:socket.AF_INET用于表示使用IPv4地址
type:socket.SOCK_DGRAM表示使用數據報模式
s.bind((ip, port)):用于將套接字對象s和對應ip的主機及端口port綁定
注意:參數是一個元組
s.recvfrom(buffer):用于從socket中接收數據的方法
參數buffer:用于接收數據的緩沖區大小
返回值:得到客戶端發送的消息和客戶端的主機地址等信息
s.sendto(data, address):用于發送數據的方法
參數data:要發送的數據
參數address:數據發送的目的地地址
s.close()用于關閉套接字對象
使用完之后,一定要記得關閉網絡套接字對象,釋放系統資源哦
和TCP網絡編程一樣,首先我們先開發服務端程序
服務端的程序開發步驟:首先創建表示網絡傳輸的套接字對象socket();其次綁定對應的主機IP地址和端口號;接下來就可以進行消息的收發處理了;最后關閉套接字對象釋放系統資源
UDP服務端編程
# 引入socket模塊
import socket
# 創建socket對象
sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定主機端口
sc.bind(("", 9999))
# 開始收發消息
data = True
while data:
# 接收客戶端發送的消息
data, addr = sc.recvfrom(1024)
if "bye" == data.decode("UTF-8"):
print("結束通話")
break
print("客戶端發來消息:%s" % data.decode("UTF-8"))
# 發送消息
data = input("請輸入要發送給客戶端的消息:")
sc.sendto(data.encode("UTF-8"), addr)
# 關閉套接字對象
sc.close()
相對于服務端的編程,客戶端編程非常簡單,創建一個連接服務器的套接字對象,就可以直接進行數據收發處理了
UDP客戶端編程處理
import socket
# 創建socket套接字對象
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 開始收發消息
data = input("請輸入要發送給服務器的消息:")
while data:
# 發送消息
client.sendto(data.encode("UTF-8"), ("192.168.10.108", 9999))
# 接收消息
data, addr = client.recvfrom(2014)
if "bye" == data.decode("UTF-8"):
print("結束通話")
break;
print("服務器%s發來消息:%s" % (addr, data.decode("UTF-8")))
data = input("請輸入要發送給服務器的消息:")
# 關閉套接字對象
client.close()
運行上面的服務端程序和客戶端程序,就可以實現服務端和客戶端之間的數據通信了。和TCP不同的是,大家可以通過上面的程序進行測試,當服務端或者客戶端一方的程序結束時,不會影響另一方的程序運行。
>>>更多VR/AR入門教程:VR入門