UDP 协议主要特点:
- 无连接:UDP 在数据传输前不需要像 TCP 那样建立连接,发送端直接将数据报发送出去,减少了连接建立和拆除的开销,适合对实时性要求高但对数据准确性要求相对较低的场景,如视频流、音频流传输。
- 不可靠:UDP 不保证数据报一定能到达目的地,也不保证数据报的顺序和不重复。它没有重传机制,若数据在传输过程中丢失,不会自动重发。
- 面向数据报:UDP 以数据报为单位进行传输,对应用层交下来的报文,不合并也不拆分,保留报文的边界。每次发送一个完整的数据报,接收端也必须以完整的数据报为单位进行接收。
- 首部开销小:UDP 首部只有 8 字节,相比 TCP 首部 20 字节(不包含选项字段),开销更小,在传输数据量较小时优势明显。
Socket 编程中基于 UDP 协议的服务器端关键代码步骤(以 Python 为例):
import socket
# 创建 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定 IP 地址和端口号
server_address = ('localhost', 12345)
server_socket.bind(server_address)
print('Server is listening on {}:{}'.format(*server_address))
while True:
# 接收数据和客户端地址
data, client_address = server_socket.recvfrom(1024)
print('Received {} bytes from {}'.format(len(data), client_address))
print('Data: {}'.format(data.decode('utf - 8')))
# 发送响应数据
response = 'Message received successfully!'
server_socket.sendto(response.encode('utf - 8'), client_address)
Socket 编程中基于 UDP 协议的客户端关键代码步骤(以 Python 为例):
import socket
# 创建 UDP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DUDP)
# 服务器地址
server_address = ('localhost', 12345)
# 发送数据
message = 'Hello, server!'
client_socket.sendto(message.encode('utf - 8'), server_address)
# 接收响应数据
data, server_address = client_socket.recvfrom(1024)
print('Received {} bytes from {}'.format(len(data), server_address))
print('Data: {}'.format(data.decode('utf - 8')))
# 关闭套接字
client_socket.close()