** 本節(jié)內(nèi)容如下**
- 什么是UDP協(xié)議
- UDP網(wǎng)絡(luò)編程——服務(wù)端程序開發(fā)
- UDP網(wǎng)絡(luò)編程——客戶端程序開發(fā)
1.什么是UDP協(xié)議
回顧TCP協(xié)議:一個(gè)非常重要的數(shù)據(jù)傳輸協(xié)議勤婚,很多網(wǎng)絡(luò)協(xié)議都是以TCP協(xié)議為基礎(chǔ)的窜觉;TCP協(xié)議要求服務(wù)器和客戶端通過三次握手交互的方式建立可靠的連接,然后再進(jìn)行數(shù)據(jù)保溫的發(fā)送臊泌,在發(fā)送過程中保證數(shù)據(jù)包的順序和數(shù)量不會(huì)丟失匠楚,最后如果要斷開連接需要四次揮手的方式進(jìn)行連接的安全斷開画机。
UDP協(xié)議:是一種用戶數(shù)據(jù)報(bào)協(xié)議盛卡,是一種非連接的協(xié)議,傳輸數(shù)據(jù)之前服務(wù)端和客戶端之間不建立連接唆香,當(dāng)進(jìn)行數(shù)據(jù)傳送時(shí)就將應(yīng)用程序中的數(shù)據(jù)提取出來并放在網(wǎng)絡(luò)上嫌变;
發(fā)送端發(fā)送數(shù)據(jù),只是收到當(dāng)前應(yīng)用程序生成數(shù)據(jù)的速度躬它、計(jì)算能力和傳輸帶寬等因素的影響
接收端接收數(shù)據(jù)腾啥,UDP將消息放在一個(gè)消息隊(duì)列中,應(yīng)用程序從消息隊(duì)列中讀取消息
UDP特性:
1冯吓、傳輸數(shù)據(jù)不建立連接倘待,不需要維護(hù)連接狀態(tài),同一個(gè)服務(wù)端可以向多個(gè)客戶端廣播發(fā)送消息
2组贺、UDP數(shù)據(jù)包標(biāo)題8個(gè)字節(jié)凸舵,TCP需要20個(gè)字節(jié),額外開銷較小
3失尖、UDP是不可靠的傳輸協(xié)議啊奄,不保證所有的數(shù)據(jù)接收端完整并且正確的接收
4、UDP協(xié)議是面向報(bào)文的掀潮,發(fā)送端UDP直接將程序中的數(shù)據(jù)封裝成報(bào)文交給IP層進(jìn)行傳輸菇夸,所以需要我們?cè)诔绦蛑刑幚砗脠?bào)文數(shù)據(jù)的大小
關(guān)于TCP和UDP那點(diǎn)事兒
1、基于連接和非連接的
2仪吧、對(duì)系統(tǒng)資源的消耗多和少
3庄新、TCP程序結(jié)構(gòu)復(fù)雜、UDP程序結(jié)構(gòu)簡單明了
4薯鼠、數(shù)據(jù)流模式的數(shù)據(jù)和數(shù)據(jù)報(bào)模式的數(shù)據(jù)
5择诈、TCP是可靠的傳輸協(xié)議鬓椭,UDP是不可靠的傳輸協(xié)議
2.UDP編程API簡單了解
socket(family, type):用于表示網(wǎng)絡(luò)連接的socket對(duì)象
family:socket.AF_INET用于表示使用IPv4地址
type:socket.SOCK_DGRAM表示使用數(shù)據(jù)報(bào)模式
s.bind((ip, port)):用于將套接字對(duì)象s和對(duì)應(yīng)ip的主機(jī)及端口port綁定
注意:參數(shù)是一個(gè)元組
s.recvfrom(buffer):用于從socket中接收數(shù)據(jù)的方法
參數(shù)buffer:用于接收數(shù)據(jù)的緩沖區(qū)大小
返回值:得到客戶端發(fā)送的消息和客戶端的主機(jī)地址等信息
s.sendto(data, address):用于發(fā)送數(shù)據(jù)的方法
參數(shù)data:要發(fā)送的數(shù)據(jù)
參數(shù)address:數(shù)據(jù)發(fā)送的目的地地址
s.close()用于關(guān)閉套接字對(duì)象
使用完之后蒿讥,一定要記得關(guān)閉網(wǎng)絡(luò)套接字對(duì)象搭独,釋放系統(tǒng)資源哦
3. UDP服務(wù)端編程
和TCP網(wǎng)絡(luò)編程一樣郁竟,首先我們先開發(fā)服務(wù)端程序
服務(wù)端的程序開發(fā)步驟:首先創(chuàng)建表示網(wǎng)絡(luò)傳輸?shù)奶捉幼謱?duì)象socket()叔收;其次綁定對(duì)應(yīng)的主機(jī)IP地址和端口號(hào)光戈;接下來就可以進(jìn)行消息的收發(fā)處理了控硼;最后關(guān)閉套接字對(duì)象釋放系統(tǒng)資源
# 引入socket模塊
import socket
# 創(chuàng)建socket對(duì)象
sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定主機(jī)端口
sc.bind(("", 9999))
# 開始收發(fā)消息
data = True
while data:
# 接收客戶端發(fā)送的消息
data, addr = sc.recvfrom(1024)
if "bye" == data.decode("UTF-8"):
print("結(jié)束通話")
break
print("客戶端發(fā)來消息:%s" % data.decode("UTF-8"))
# 發(fā)送消息
data = input("請(qǐng)輸入要發(fā)送給客戶端的消息:")
sc.sendto(data.encode("UTF-8"), addr)
# 關(guān)閉套接字對(duì)象
sc.close()
4. UDP客戶端編程
相對(duì)于服務(wù)端的編程漱牵,客戶端編程非常簡單暇仲,創(chuàng)建一個(gè)連接服務(wù)器的套接字對(duì)象步做,就可以直接進(jìn)行數(shù)據(jù)收發(fā)處理了
import socket
# 創(chuàng)建socket套接字對(duì)象
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 開始收發(fā)消息
data = input("請(qǐng)輸入要發(fā)送給服務(wù)器的消息:")
while data:
# 發(fā)送消息
client.sendto(data.encode("UTF-8"), ("192.168.10.108", 9999))
# 接收消息
data, addr = client.recvfrom(2014)
if "bye" == data.decode("UTF-8"):
print("結(jié)束通話")
break;
print("服務(wù)器%s發(fā)來消息:%s" % (addr, data.decode("UTF-8")))
data = input("請(qǐng)輸入要發(fā)送給服務(wù)器的消息:")
# 關(guān)閉套接字對(duì)象
client.close()
運(yùn)行上面的服務(wù)端程序和客戶端程序,就可以實(shí)現(xiàn)服務(wù)端和客戶端之間的數(shù)據(jù)通信了奈附。和TCP不同的是全度,大家可以通過上面的程序進(jìn)行測試,當(dāng)服務(wù)端或者客戶端一方的程序結(jié)束時(shí)斥滤,不會(huì)影響另一方的程序運(yùn)行将鸵。
老黃歷:農(nóng)歷五月初六
[宜]
晚上加班
晚上是程序員精神最好的時(shí)候
瀏覽成人網(wǎng)站
重拾對(duì)生活的信心
提交代碼
遇到?jīng)_突的幾率是最低的
開會(huì)
寫代碼之余放松一下打個(gè)盹,有益健康
座位朝向:面向西南方寫程序佑颇,BUG 最少顶掉。
今日宜飲:茶,綠茶
女神親近指數(shù):★★★★★