Python - UDP通訊

weixin_33807284發表於2018-02-05

UDP通訊原理

由於UDP協議不是基於連結的協議,所以在傳送資料的時候不需要建立連結。在資料的每一次傳送和接收的時候,都需要傳送UDP報頭,指定接收端的IP和埠資訊。效率與TCP相比更高。使用UDP的常見服務如DNS,FTP等。
UDP資料包一般包含512個位元組,當大於512位元組時,可能會出現傳輸不穩定的情況。

示例:

# 服務端
# coding=utf-8
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 基於網路的資料包協議 UDP
server.bind(('127.0.0.1',8080))

while True:
    msg,addr=server.recvfrom(1024)
    print(msg,addr)
    server.sendto(msg.upper(),addr)
    
    

# 客戶端
#_*_coding:utf-8_*_

import socket

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

while True:
    msg=input('>>: ').strip()
    if not msg:continue

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

    back_msg,addr=client.recvfrom(1024)
    print(back_msg.decode('utf-8'),addr)

  • UDP每個傳送的資料都含所有自身的報頭,不像TCP那樣是流式的資料,所以不存在粘包現象。

  • udp的recvfrom是阻塞的,一個recvfrom(x)必須對唯一一個sendto(y),收完了x個位元組的資料就算完成,若是y>x資料就丟失,這意味著udp根本不會粘包,但是會丟資料,不可靠。

  • tcp 協議的資料不會丟,沒有收完的包下一次會接著收取上一次沒收完的資料,本端總是在收到ack時才會清除緩衝區內容。資料是可靠的,但是會粘包。

相關文章