~~網絡編程(八):UDP~~


進擊のpython

*****

網絡編程——UDP


那現在看到這里的

這就是網絡編程的最后一講了

上面講的都是關於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協議傳輸方式就不適合下載文件或者遠程命令

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

QQ信息傳輸也是UDP協議

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

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


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

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

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

接着對TCP協議模式的信息傳輸進行了仔細的分析

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

最后提了一下UDP協議的使用以及相對於TCP來說的優缺點

下一部分就是並發編程了,有興趣的繼續關注我吧!


*本part結束*
*寫幾個番外*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM