Python實現UDP與TCP通信的示例詳解

1. UDP

UDP是一種無連接的、不可靠的傳輸協議,相比於TCP,UDP具有數據傳輸速度快、傳輸延遲小等優點,但是不保證數據的可靠傳輸,需要應用層進行數據重傳、校驗等處理。

下面是一個簡單的UDP發送示例代碼:

import socket

UDP_IP = '127.0.0.1'   # 目標IP地址
UDP_PORT = 5005        # 目標端口號
MESSAGE = b"Hello, World!"   # 要發送的數據

# 創建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 發送數據
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

# 關閉套接字
sock.close()

下面是一個簡單的UDP接收示例代碼:

import socket

UDP_IP = '127.0.0.1'   # 監聽IP地址
UDP_PORT = 5005        # 監聽端口號

# 創建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 綁定套接字到指定IP地址和端口號
sock.bind((UDP_IP, UDP_PORT))

# 接收數據
data, addr = sock.recvfrom(1024)   # 一次最多接收1024字節的數據

print("Received message:", data)

# 關閉套接字
sock.close()

需要註意的是,在UDP通信中,由於數據包的大小限制,可能需要對發送的數據進行分片處理,同時也需要對接收到的數據進行緩存和拼接處理,以保證數據的完整性。

在IPv4網絡中,UDP數據包的最大長度為64KB(65535字節),其中包括IP頭部和UDP頭部的大小。在實際應用中,由於網絡設備和操作系統的限制,UDP數據包的大小通常會受到一些限制。例如,某些路由器和防火墻可能會限制UDP數據包的最大長度,而一些操作系統也可能會對UDP數據包進行一些限制。

在使用UDP進行數據傳輸時,需要註意數據包的大小限制,盡量避免發送過大的數據包。可以使用getsockopt()方法查詢系統對UDP數據包大小的限制,例如:

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是一種可靠的、面向連接的傳輸協議,提供瞭數據傳輸的可靠性和完整性保障,但是傳輸效率相對較低。

下面是一個簡單的TCP服務端和客戶端示例代碼:

TCP服務端:

import socket

# 設置IP地址和端口號
IP = '127.0.0.1'
PORT = 8888

# 創建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定IP地址和端口號
sock.bind((IP, PORT))

# 開始監聽
sock.listen(1)

print(f"Server listening on {IP}:{PORT}...")

# 接受客戶端連接
conn, addr = sock.accept()
print(f"Connected by {addr[0]}:{addr[1]}")

# 接收數據
data = conn.recv(1024)
print(f"Received data: {data.decode()}")

# 發送數據
msg = b"Hello, Client!"
conn.sendall(msg)

# 關閉連接
conn.close()

TCP客戶端:

import socket

# 設置IP地址和端口號
IP = '127.0.0.1'
PORT = 8888

# 創建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接服務器
sock.connect((IP, PORT))

# 發送數據
msg = b"Hello, Server!"
sock.sendall(msg)

# 接收數據
data = sock.recv(1024)
print(f"Received data: {data.decode()}")

# 關閉連接
sock.close()

需要註意的是,在TCP通信中,數據的傳輸需要通過連接來進行,因此需要先建立連接,然後進行數據傳輸,最後再關閉連接。由於TCP是面向連接的傳輸協議,因此需要進行三次握手等復雜的連接建立過程,相比於UDP效率較低,但是可靠性更高。

到此這篇關於Python實現UDP與TCP通信的示例詳解的文章就介紹到這瞭,更多相關Python UDP TCP通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: