網路程式設計(八) UDP

2022-05-17 02:23:33 字數 3040 閱讀 2688

*****

那現在看到這裡的

這就是網路程式設計的最後一講了

上面講的都是關於tcp的程式設計方法

還記得tcp和udp傳輸的區別嗎?

udp簡單就簡單到它可以不借助管道來進行資料的傳輸

那要怎那麼通過套接字方法來進行udp方式的資訊傳輸呢?

老規矩,資訊收發建立兩個py檔案,服務端和客戶端

server = socket.socket(socket.af_inet,socket.sock_dgram)
還記得這句話在tcp怎麼寫的吧

在這裡資料傳輸方式用的是「資料報模式」,所以udp協議也叫資料報協議

(phone = socket.socket(socket.af_inet, socket.sock_stream))

在這就要講了,流式協議是不是有粘包現象啊

不好意思熬,在udp這根本就沒有這個現象

我們發現這個socket.socket每次都寫很麻煩

所以我們可以在開始匯入模組的時候這麼寫

form socket import *
雖然說不建議用*來匯入模組,但是由於我們要使用的方法太多了

所以說,就可以對這個模組全部匯入

所以上面的方法就可以寫成

server = socket(socket.af_inet,socket.sock_dgram)
那什麼繫結埠,繫結ip,是不是都需要?

server.bind(("127.0.0.1", 8080))
那需不需要監聽呢?server.listen(5)

我這是udp,有鏈結嘛?是不是沒有?所以不需要監聽

那需不需要server.accept()呢?

還是這句話,accept是為了鏈結才使用的,我udp沒有鏈結,所以也不要

那沒有鏈結,是不是不需要鏈結迴圈了啊

那通訊迴圈是不是還應該要啊

在udp中,收訊息叫 recvfrom() 發訊息用 sendto()

while 1:

data = server.recvfrom(1024)

print(data)

server.close()

那服務端就寫完了

接下來就是客戶端了

客戶端需不需要繫結ip? 當然不需要!

客戶端需不需要建立管道?當然不需要!

那我能不能傳送空呢?

對於tcp來說是不能的,那看看udp呢

msg = input(">>>")

client.sendto(msg.encode("utrf-8"),("127.0.0.1", 8080))

sendto接收兩個引數,第乙個是你傳送的資訊,第二個是你要發給的ip和埠號的元組形式

那,客戶端和服務端就寫完了

# 客戶端

from socket import *

client = socket(af_inet, sock_dgram)

while 1:

msg = input(">>>")

client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080))

client.close()

# 服務端

from socket import *

server = socket(af_inet, sock_dgram)

server.bind(("127.0.0.1", 8080))

while 1:

data = server.recvfrom(1024)

print(data)

server.close()

# 客戶端

>>>haha

>>>dawdadwad

>>>fdafwa

# 服務端

(b'haha', ('127.0.0.1', 63671))

(b'dawdadwad', ('127.0.0.1', 63671))

(b'fdafwa', ('127.0.0.1', 63671))

然後我發現,我的data接收的是乙個元組形式

前面的是傳送的內容,後面的是客戶端的ip和埠

我要內容我能理解,那我為啥還要他的ip和埠啊?

很簡單,因為我得知道這個資料是誰給我發的啊,然後我好回啊

那就完成了服務端與客戶端的互動了

data,client_addr = server.recvfrom(1024)

server.sendto(data.upper(),client_addr)

解決上面提出的問題,當我發空的時候,也是可以執行的,所以不用考慮空的問題

而且,因為他是資料報協議,每次發的時候其實就是把所有的資訊都發過來了

這樣每個資料之間就不存在聯絡,也就沒有粘包的可能性

那既然這麼方便,為什麼不用udp啊

還記得我們說過他的不安全嗎?

如果資料傳輸中經歷了網路波動,那資訊就沒有了

而且別人也不會再給你發一遍

再乙個就是,接收資訊可能不會完整(你試試把recvfrom()裡面的數字變成1看看效果)

所以有這兩種的不穩定性

但是查詢東西用的就是udp協議

qq資訊傳輸也是udp協議

查詢要的就是快,不可靠大不了我再查一遍

但是總歸來說,tcp用的還是挺多的

這一part的東西其實挺少的,大部分都是概念為主

從剛開始的五層協議,進而了解到兩個協議

然後通過套接字方法搭建起應用層和傳輸層的橋梁

接著對tcp協議模式的資訊傳輸進行了仔細的分析

研究出一套近乎通用的模板

最後提了一下udp協議的使用以及相對於tcp來說的優缺點

下一部分就是併發程式設計了,有興趣的繼續關注我吧!

*本part結束*

*寫幾個番外*

UDP網路程式設計

基於udp 伺服器 程式步驟 1.建立乙個socket,用socket 函式 2.繫結ip位址 埠等資訊到socket上,用函式bind 3.迴圈接收資料,用recvfrom 4.關閉網路連線。基於udp 客戶端 程式步驟 1.建立乙個socket,用socket 函式 2.繫結ip位址 埠等資訊到...

UDP網路程式設計

基於udp 通訊模型 由上圖可以看出udp通訊的步驟如下 基於udp 伺服器 1 建立乙個socket,用函式socket 2 繫結ip位址 埠等資訊到socket上,用函式bind 3 迴圈接收資料,用函式recvfrom 4 關閉網路連線 基於udp 客戶端 1 建立乙個socket,用函式so...

網路程式設計 UDP

網路程式設計傳輸層選擇乙個資料控制模式 tcp或者udp,前面我們已經介紹了tcp程式設計,這篇我們簡單的來看看udp程式設計。udp是無連線的不可靠的資料報服務。udp協議在ip協議上增加了復用 分用和差錯檢測功能。udp的特點 a 是無連線的。相比於tcp協議,udp協議在傳送資料前不需要建立連...