日韩 亚洲一区二_久久vs国产综合色大全_国产精品福利在线_欧美在线一级A片免费观看欧美在线_女同性毛片60分钟

您現(xiàn)在所在的位置:首頁(yè) >學(xué)習(xí)資源 > Python全棧+人工智慧入門(mén)教材 > Python基礎(chǔ)入門(mén)教程30.3:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階 UDP編程

Python基礎(chǔ)入門(mén)教程30.3:企業(yè)級(jí)開(kāi)發(fā)進(jìn)階 UDP編程

來(lái)源:奇酷教育 發(fā)表於:

本節(jié)內(nèi)容如下什麼是UDP協(xié)議UDP網(wǎng)絡(luò)編程——服務(wù)端程序開(kāi)發(fā)UDP網(wǎng)絡(luò)編程——客戶(hù)端程序開(kāi)發(fā)1 什麼是UDP協(xié)議回顧TCP協(xié)議:一個(gè)非常重要的數(shù)據(jù)

本節(jié)內(nèi)容如下
  • 什麼是UDP協(xié)議
  • UDP網(wǎng)絡(luò)編程——服務(wù)端程序開(kāi)發(fā)
  • UDP網(wǎng)絡(luò)編程——客戶(hù)端程序開(kāi)發(fā)

1.什麼是UDP協(xié)議

回顧TCP協(xié)議:一個(gè)非常重要的數(shù)據(jù)傳輸(shū)協(xié)議,很多網(wǎng)絡(luò)協(xié)議都是以TCP協(xié)議為基礎(chǔ)的;TCP協(xié)議要求伺服器和客戶(hù)端通過(guò)三次握手交互的方式建立可靠的連接,然後再進(jìn)行數(shù)據(jù)保溫的發(fā)送,在發(fā)送過(guò)程中保證數(shù)據(jù)包的順序和數(shù)量不會(huì)丟失,最後如果要斷開(kāi)連接需要四次揮手的方式進(jìn)行連接的安全斷開(kāi)。

UDP協(xié)議:是一種用戶(hù)數(shù)據(jù)報(bào)協(xié)議,是一種非連接的協(xié)議,傳輸(shū)數(shù)據(jù)之前服務(wù)端和客戶(hù)端之間不建立連接,當(dāng)進(jìn)行數(shù)據(jù)傳送時(shí)就將應(yīng)用程式中的數(shù)據(jù)提取出來(lái)並放在網(wǎng)絡(luò)上;
發(fā)送端發(fā)送數(shù)據(jù),只是收到當(dāng)前應(yīng)用程式生成數(shù)據(jù)的速度、計(jì)算能力和傳輸(shū)帶寬等因素的影響
接收端接收數(shù)據(jù),UDP將消息放在一個(gè)消息隊(duì)列中,應(yīng)用程式從消息隊(duì)列中讀取消息

UDP特性:
1、傳輸(shū)數(shù)據(jù)不建立連接,不需要維護(hù)連接狀態(tài),同一個(gè)服務(wù)端可以向多個(gè)客戶(hù)端廣(guǎng)播發(fā)送消息
2、UDP數(shù)據(jù)包標(biāo)題8個(gè)字節(jié),TCP需要20個(gè)字節(jié),額外開(kāi)銷(xiāo)較小
3、UDP是不可靠的傳輸(shū)協(xié)議,不保證所有的數(shù)據(jù)接收端完整並且正確的接收
4、UDP協(xié)議是面向報(bào)文的,發(fā)送端UDP直接將程序中的數(shù)據(jù)封裝成報(bào)文交給IP層進(jìn)行傳輸(shū),所以需要我們在程序中處理好報(bào)文數(shù)據(jù)的大小

關(guān)於TCP和UDP那點(diǎn)事兒
1、基於連接和非連接的
2、對(duì)系統(tǒng)資源的消耗多和少
3、TCP程序結(jié)構(gòu )複雜、UDP程序結(jié)構(gòu )簡(jiǎn)單明了
4、數(shù)據(jù)流模式的數(shù)據(jù)和數(shù)據(jù)報(bào)模式的數(shù)據(jù)
5、TCP是可靠的傳輸(shū)協(xié)議,UDP是不可靠的傳輸(shū)協(xié)議

2.UDP編程API簡(jiǎn)單了解


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ū)大小
返回值:得到客戶(hù)端發(fā)送的消息和客戶(hù)端的主機(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ò)編程一樣,首先我們先開(kāi)發(fā)服務(wù)端程序
服務(wù)端的程序開(kāi)發(fā)步驟:首先創(chuàng)建表示網(wǎng)絡(luò)傳輸(shū)的套接字對(duì)象socket();其次綁定對(duì)應(yīng)的主機(jī)IP位址和埠號(hào);接下來(lái)就可以進(jìn)行消息的收發(fā)處理了;最後關(guān)閉套接字對(duì)象釋放系統(tǒng)資源


UDP服務(wù)端編程

# 引入socket模塊

import socket



# 創(chuàng)建socket對(duì)象

sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)



# 綁定主機(jī)埠

sc.bind(("", 9999))



# 開(kāi)始收發(fā)消息

data = True

while data:

    # 接收客戶(hù)端發(fā)送的消息

    data, addr = sc.recvfrom(1024)

    if "bye" == data.decode("UTF-8"):

        print("結(jié)束通話(huà)")

        break

    print("客戶(hù)端發(fā)來(lái)消息:%s" % data.decode("UTF-8"))



    # 發(fā)送消息

    data = input("請輸(shū)入要發(fā)送給客戶(hù)端的消息:")

    sc.sendto(data.encode("UTF-8"), addr)



# 關(guān)閉套接字對(duì)象

sc.close()

4. UDP客戶(hù)端編程

相對(duì)於服務(wù)端的編程,客戶(hù)端編程非常簡(jiǎn)單,創(chuàng)建一個(gè)連接伺服器的套接字對(duì)象,就可以直接進(jìn)行數(shù)據(jù)收發(fā)處理了


UDP客戶(hù)端編程處理

import socket

# 創(chuàng)建socket套接字對(duì)象

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)



# 開(kāi)始收發(fā)消息

data = input("請輸(shū)入要發(fā)送給伺服器的消息:")

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é)束通話(huà)")

        break;

    print("伺服器%s發(fā)來(lái)消息:%s" % (addr, data.decode("UTF-8")))

    data = input("請輸(shū)入要發(fā)送給伺服器的消息:")



# 關(guān)閉套接字對(duì)象

client.close()

運(yùn)行上面的服務(wù)端程序和客戶(hù)端程序,就可以實(shí)現(xiàn)服務(wù)端和客戶(hù)端之間的數(shù)據(jù)通信了。和TCP不同的是,大家可以通過(guò)上面的程序進(jìn)行測(cè)試,當(dāng)服務(wù)端或者客戶(hù)端一方的程序結(jié)束時(shí),不會(huì)影響另一方的程序運(yùn)行。

 >>>更多VR/AR入門(mén)教程:VR入門(mén)