UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议。它不保证数据包的顺序或可靠性,也不进行流量控制或拥塞控制。UDP套接字允许应用程序发送和接收UDP数据报。
当使用Python的UDP套接字时,即使数据源已经停止发送数据,接收端仍然可能继续接收数据。这是因为UDP是无连接的协议,接收端不会主动检测发送端的状态。
为了确保接收端在发送端停止后不再接收数据,可以在接收端实现一个超时机制,或者在接收到特定的终止信号后停止接收。
import socket
import time
def udp_receiver(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
print(f"Listening on {host}:{port}")
while True:
try:
data, addr = sock.recvfrom(1024)
print(f"Received message: {data} from {addr}")
if data == b'TERMINATE':
print("Terminating receiver...")
break
except socket.timeout:
print("No data received in the last 5 seconds. Exiting...")
break
sock.close()
if __name__ == "__main__":
host = '127.0.0.1'
port = 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5) # Set a timeout for recvfrom
udp_receiver(host, port)
通过设置超时机制,接收端可以在一段时间内没有接收到数据时自动退出循环,从而避免在发送端停止后继续接收数据。
领取专属 10元无门槛券
手把手带您无忧上云