Python實(shí)現(xiàn)UDP與TCP通信的示例詳解
1. UDP
UDP是一種無連接的、不可靠的傳輸協(xié)議,相比于TCP,UDP具有數(shù)據(jù)傳輸速度快、傳輸延遲小等優(yōu)點(diǎn),但是不保證數(shù)據(jù)的可靠傳輸,需要應(yīng)用層進(jìn)行數(shù)據(jù)重傳、校驗(yàn)等處理。
下面是一個(gè)簡(jiǎn)單的UDP發(fā)送示例代碼:
import socket UDP_IP = '127.0.0.1' # 目標(biāo)IP地址 UDP_PORT = 5005 # 目標(biāo)端口號(hào) MESSAGE = b"Hello, World!" # 要發(fā)送的數(shù)據(jù) # 創(chuàng)建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 發(fā)送數(shù)據(jù) sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) # 關(guān)閉套接字 sock.close()
下面是一個(gè)簡(jiǎn)單的UDP接收示例代碼:
import socket
UDP_IP = '127.0.0.1' # 監(jiān)聽I(yíng)P地址
UDP_PORT = 5005 # 監(jiān)聽端口號(hào)
# 創(chuàng)建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定套接字到指定IP地址和端口號(hào)
sock.bind((UDP_IP, UDP_PORT))
# 接收數(shù)據(jù)
data, addr = sock.recvfrom(1024) # 一次最多接收1024字節(jié)的數(shù)據(jù)
print("Received message:", data)
# 關(guān)閉套接字
sock.close()
需要注意的是,在UDP通信中,由于數(shù)據(jù)包的大小限制,可能需要對(duì)發(fā)送的數(shù)據(jù)進(jìn)行分片處理,同時(shí)也需要對(duì)接收到的數(shù)據(jù)進(jìn)行緩存和拼接處理,以保證數(shù)據(jù)的完整性。
在IPv4網(wǎng)絡(luò)中,UDP數(shù)據(jù)包的最大長(zhǎng)度為64KB(65535字節(jié)),其中包括IP頭部和UDP頭部的大小。在實(shí)際應(yīng)用中,由于網(wǎng)絡(luò)設(shè)備和操作系統(tǒng)的限制,UDP數(shù)據(jù)包的大小通常會(huì)受到一些限制。例如,某些路由器和防火墻可能會(huì)限制UDP數(shù)據(jù)包的最大長(zhǎng)度,而一些操作系統(tǒng)也可能會(huì)對(duì)UDP數(shù)據(jù)包進(jìn)行一些限制。
在使用UDP進(jìn)行數(shù)據(jù)傳輸時(shí),需要注意數(shù)據(jù)包的大小限制,盡量避免發(fā)送過大的數(shù)據(jù)包??梢允褂胓etsockopt()方法查詢系統(tǒng)對(duì)UDP數(shù)據(jù)包大小的限制,例如:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
max_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
print(f"Max size of UDP packet: {max_size} bytes")
2. TCP
TCP是一種可靠的、面向連接的傳輸協(xié)議,提供了數(shù)據(jù)傳輸?shù)目煽啃院屯暾员U?,但是傳輸效率相?duì)較低。
下面是一個(gè)簡(jiǎn)單的TCP服務(wù)端和客戶端示例代碼:
TCP服務(wù)端:
import socket
# 設(shè)置IP地址和端口號(hào)
IP = '127.0.0.1'
PORT = 8888
# 創(chuàng)建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定IP地址和端口號(hào)
sock.bind((IP, PORT))
# 開始監(jiān)聽
sock.listen(1)
print(f"Server listening on {IP}:{PORT}...")
# 接受客戶端連接
conn, addr = sock.accept()
print(f"Connected by {addr[0]}:{addr[1]}")
# 接收數(shù)據(jù)
data = conn.recv(1024)
print(f"Received data: {data.decode()}")
# 發(fā)送數(shù)據(jù)
msg = b"Hello, Client!"
conn.sendall(msg)
# 關(guān)閉連接
conn.close()TCP客戶端:
import socket
# 設(shè)置IP地址和端口號(hào)
IP = '127.0.0.1'
PORT = 8888
# 創(chuàng)建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務(wù)器
sock.connect((IP, PORT))
# 發(fā)送數(shù)據(jù)
msg = b"Hello, Server!"
sock.sendall(msg)
# 接收數(shù)據(jù)
data = sock.recv(1024)
print(f"Received data: {data.decode()}")
# 關(guān)閉連接
sock.close()需要注意的是,在TCP通信中,數(shù)據(jù)的傳輸需要通過連接來進(jìn)行,因此需要先建立連接,然后進(jìn)行數(shù)據(jù)傳輸,最后再關(guān)閉連接。由于TCP是面向連接的傳輸協(xié)議,因此需要進(jìn)行三次握手等復(fù)雜的連接建立過程,相比于UDP效率較低,但是可靠性更高。
到此這篇關(guān)于Python實(shí)現(xiàn)UDP與TCP通信的示例詳解的文章就介紹到這了,更多相關(guān)Python UDP TCP通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決python3讀取Python2存儲(chǔ)的pickle文件問題
今天小編就為大家分享一篇解決python3讀取Python2存儲(chǔ)的pickle文件問題,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
每個(gè) Python 開發(fā)者都應(yīng)該知道的7種好用工具(效率翻倍)
Python 從一種小的開源語(yǔ)言開始,到現(xiàn)在,它已經(jīng)成為開發(fā)者很受歡迎的編程語(yǔ)言之一。這篇文章主要介紹了每個(gè) Python 開發(fā)者都應(yīng)該知道的7種好用工具(效率翻倍),需要的朋友可以參考下2021-03-03
Python實(shí)現(xiàn)遍歷包含大量文件的文件夾
在處理大模型的訓(xùn)練數(shù)據(jù)時(shí),經(jīng)常需要遍歷大型文件夾,其中,可能包括數(shù)千萬或數(shù)億個(gè)文件,所以本文為大家整理了Python遍歷包含大量文件的文件夾的方法,希望對(duì)大家有所幫助2023-04-04
python 制作自定義包并安裝到系統(tǒng)目錄的方法
今天小編就為大家分享一篇python 制作自定義包并安裝到系統(tǒng)目錄的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù)
今天小編就為大家分享一篇python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12

