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è)簡單的UDP發(fā)送示例代碼:
import socket UDP_IP = '127.0.0.1' # 目標(biāo)IP地址 UDP_PORT = 5005 # 目標(biā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è)簡單的UDP接收示例代碼:
import socket UDP_IP = '127.0.0.1' # 監(jiān)聽IP地址 UDP_PORT = 5005 # 監(jiān)聽端口號 # 創(chuàng)建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 綁定套接字到指定IP地址和端口號 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ù)包的大小限制,可能需要對發(fā)送的數(shù)據(jù)進(jìn)行分片處理,同時(shí)也需要對接收到的數(shù)據(jù)進(jìn)行緩存和拼接處理,以保證數(shù)據(jù)的完整性。
在IPv4網(wǎng)絡(luò)中,UDP數(shù)據(jù)包的最大長度為64KB(65535字節(jié)),其中包括IP頭部和UDP頭部的大小。在實(shí)際應(yīng)用中,由于網(wǎng)絡(luò)設(shè)備和操作系統(tǒng)的限制,UDP數(shù)據(jù)包的大小通常會受到一些限制。例如,某些路由器和防火墻可能會限制UDP數(shù)據(jù)包的最大長度,而一些操作系統(tǒng)也可能會對UDP數(shù)據(jù)包進(jìn)行一些限制。
在使用UDP進(jìn)行數(shù)據(jù)傳輸時(shí),需要注意數(shù)據(jù)包的大小限制,盡量避免發(fā)送過大的數(shù)據(jù)包。可以使用getsockopt()方法查詢系統(tǒng)對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希莻鬏斝氏鄬^低。
下面是一個(gè)簡單的TCP服務(wù)端和客戶端示例代碼:
TCP服務(wù)端:
import socket # 設(shè)置IP地址和端口號 IP = '127.0.0.1' PORT = 8888 # 創(chuàng)建TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定IP地址和端口號 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地址和端口號 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決python3讀取Python2存儲的pickle文件問題
今天小編就為大家分享一篇解決python3讀取Python2存儲的pickle文件問題,具有很好的參考價(jià)值。希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10每個(gè) Python 開發(fā)者都應(yīng)該知道的7種好用工具(效率翻倍)
Python 從一種小的開源語言開始,到現(xiàn)在,它已經(jīng)成為開發(fā)者很受歡迎的編程語言之一。這篇文章主要介紹了每個(gè) Python 開發(fā)者都應(yīng)該知道的7種好用工具(效率翻倍),需要的朋友可以參考下2021-03-03Python實(shí)現(xiàn)遍歷包含大量文件的文件夾
在處理大模型的訓(xùn)練數(shù)據(jù)時(shí),經(jīng)常需要遍歷大型文件夾,其中,可能包括數(shù)千萬或數(shù)億個(gè)文件,所以本文為大家整理了Python遍歷包含大量文件的文件夾的方法,希望對大家有所幫助2023-04-04python 制作自定義包并安裝到系統(tǒng)目錄的方法
今天小編就為大家分享一篇python 制作自定義包并安裝到系統(tǒng)目錄的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù)
今天小編就為大家分享一篇python實(shí)現(xiàn)從wind導(dǎo)入數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12