TCP和UDP是OSI七層模型中傳輸層的兩個協議,對應了兩種傳輸方式
特點如下,更多更詳細請訪問:TCP與UDP的全面對比
|
|
UDP |
TCP |
|
是否連接 |
無連接 |
面向連接 |
|
是否可靠 |
不可靠傳輸,不使用流量控制和擁塞控制 |
可靠傳輸,使用流量控制和擁塞控制 |
|
連接物件個數 |
支持一對一,一對多,多對一和多對多互動通信 |
只能是一對一通信 |
|
傳輸方式 |
面向報文 |
面向位元組流 |
|
首部開銷 |
首部開銷小,僅8位元組 |
首部最小20位元組,最大60位元組 |
|
適用場景 |
適用于實時應用(IP電話、視頻會議、直播等) |
適用于要求可靠傳輸的應用,例如檔案傳輸 |
而在Python下,兩者的編程實作主要有以下區別:
|
|
UDP |
TCP |
|
socket創建 |
socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
資料傳輸 |
sendto()、recvfrom() 不是一對一 所以要指明對方地址 |
send()、recv() |
|
與對方構建連接 |
無需連接,直接向對方IP地址傳輸 |
需要使用listen()、accept()、connect(),需要雙方互相“握手” |
下面讓我們看看在Python下兩者的具體實作,從而理解其主要區別:
##UDP服務端 import socket #建立IPv4,UDP的socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #系結埠: s.bind(('127.0.0.1', 9999)) #不需要開啟listen,直接接收所有的資料 print('Bind UDP on 9999') while True: #接收來自客戶端的資料,使用recvfrom data, addr = s.recvfrom(1024) print('Received from %s:%s.' % addr) s.sendto(b'hello, %s!' % data, addr)
##UDP客戶端 import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #不需要建立連接: for data in [b'Michael', b'ALice', b'FF']: #發送資料到客戶端: s.sendto(data, ('127.0.0.1', 9999)) #接收來自客戶端的資料: print(s.recvfrom(1024)[0].decode('utf-8')) s.close()
——————————————————快樂分界線—————————————————————
##TCP服務端 #匯入socket庫 import socket import threading import time def deal_by_tcp(sock, addr):#新執行緒執行的函式 print('Accept connection from %s:%s...'.format(addr[0],addr[1])) sock.send(('Welcome!').encode('utf-8')) while True: data = sock.recv(1024) time.sleep(1) #如果客戶端沒有發送資料或發送’exit‘:關閉連接 if not data or data.decode('utf-8') =='exit': break sock.send(('Hello, %s'.format(data.decode('utf-8')).encode('utf-8'))) sock.close() print('Connection from %s:%s closed'.format(addr[0],addr[1])) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #系結監聽埠 s.bind(('127.0.0.1', 9999)) #開始監聽: s.listen(5) #param : 等待連接的最大數量 print('waiting for connecting') while True: #接收一個新的連接: sock, addr = s.accept() #accept會等待并發回傳一個客戶端的連接 #使用多執行緒處理:單執行緒在處理程序中,無法接收其他客戶端的連接 t = threading.Thread(target=deal_by_tcp, args=(sock,addr)) t.start() #啟動執行緒
##TCP客戶端 #匯入socket庫 import socket import io #創建一個socket: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1',9999)) s.send(b'Norton') #接收從服務器回傳的資料: while True: d = s.recv(1024) #每次最多接收1K位元組 if d: print(d.decode('utf-8')) else: break s.close()
可以發現,TCP的構建傳輸的互動程序更為復雜,而傳輸程序更為簡明且具有針對性、UDP則更加“神經大條”,適合多發和對可靠性要求不高的網路,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147664.html
標籤:Python
上一篇:月薪2萬的爬蟲工程師,Python需要學到什么程度?
下一篇:Python: 串列推導式
