Python UDP 编程详解:原理、流程与代码实现

Jasper
Jasper
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析 Python 中的 UDP 编程,对比 TCP 与 UDP 的差异,阐述 UDP 无连接、不可靠但高速的特点。详细讲解 UDP 服务器与客户端的创建步骤,包括 Socket 初始化、绑定端口、发送与接收数据报及关闭连接。通过完整的 Python 代码示例,演示如何构建简易聊天程序,帮助开发者掌握 UDP 通信的核心流程与实战应用。

UDP 协议概述与特性

此前我们探讨了 TCP 编程,了解到 TCP 能够建立可靠的连接,且通信双方均能以流的形式传输数据。接下来,我们将介绍另一种广泛使用的协议——UDP。与 TCP 不同,UDP 是一种面向无连接的协议。

UDP 协议概述

首先,我们明确 UDP 的定义:

UDP 协议(User Datagram Protocol,用户数据报协议)是 OSI(开放式系统互联)参考模型中传输层的一种无连接协议,主要提供面向事务的简单、不可靠信息传输服务。

基于上述定义,我们可以总结出 UDP 的几个关键特性及其与 TCP 的主要区别:

  • UDP 作为用户数据报协议,其传输模式为数据报;而 TCP 则是基于字节流的传输协议。
  • UDP 是无连接的,每个数据报都包含完整的源地址和目的地址信息。数据报在网络上可能通过任意路径传输,因此无法保证数据一定能到达目的地、到达的时间以及内容的完整性。
  • UDP 是一种简单且不可靠的协议,它仅负责将数据包发送出去,不确保接收方能否收到。由于无需在客户端与服务器间建立连接,也不涉及超时重传机制,因此其传输速度非常快。

从上述特性可以看出,UDP 适用于数据量小、对数据完整性要求不高且对传输速度敏感的场景。典型的即时通信应用如微信便是如此,用户常遇到先发后收或消息丢失的情况,这正是 UDP 不保证传输完整性和顺序性的体现。此外,UDP 还广泛应用于在线视频流和网络电话等场景。

UDP 传输机制与流程

UDP 传输机制

在 TCP 通信中,客户端与服务器必须先建立连接才能传输数据:客户端发起连接请求,服务器接受后双方方可通信。而在 UDP 协议中,客户端只需知晓服务器的 IP 地址和端口号,即可直接发送数据。

以下是 UDP 传输过程的流程图:

UDP 服务器的建立主要包含以下步骤:

  • 创建 Socket(套接字)
  • 将 Socket 绑定到特定的 IP 地址和端口号
  • 接收来自客户端的数据
  • 关闭连接

UDP 客户端的创建步骤如下:

  • 创建 Socket(套接字)
  • 向服务器发送数据
  • 关闭连接

需要注意的是,UDP 客户端发送数据的目标 IP 和端口号必须与 UDP 服务器监听的 IP 和端口一致。服务器只需绑定 IP 和端口,即可随时接收客户端数据,此时服务器处于阻塞状态,直到接收到数据为止。

UDP 客户端代码实现

UDP 客户端实现

创建 Socket 的方法如下:


# 导入socket库
import socket

# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

在创建 Socket 时,第一个参数 socket.AF_INET 表示使用 IPv4 协议;若需使用 IPv6,则指定为 socket.AF_INET6。SOCK_DGRAM 参数指定基于 UDP 的数据报式 Socket 通信。

创建 Socket 后,即可向目标地址发送数据报:


# 发送数据
s.sendto(b'Hello Server', ('127.0.0.1', 6000))

第一个参数为待发送的数据报内容,第二个参数是包含 IP 地址和端口号的元组。

若需接收数据,代码示例如下:


# 接收数据
data, addr = s.recv(1024)
# 解码接收到的数据
data = data.decode('utf-8')

在接收信息时,data 变量表示接收到的数据,addr 变量是对方的 IP 地址和端口号元组。

若要关闭 Socket,直接调用 close() 方法即可:


# 关闭 socket
socket.close()

UDP 服务器代码实现

UDP 服务器实现

与客户端相比,服务器端多了一个步骤:在创建 Socket 后,需绑定 IP 地址和端口号,以便接收客户端随时发送的数据。绑定方法如下:


# 绑定 IP 和端口
s.bind(('127.0.0.1', 6000))

UDP 简单聊天实例演示

UDP 简单实例

通过以下简单实例,我们可以直观地体验 UDP 客户端与服务器的通信流程。

服务器端代码如下:


import socket

# 创建 socket
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定 IP 和端口号
sk.bind(('127.0.0.1', 6000))
while True:
  # 接收数据报
  msg, addr = sk.recvfrom(1024)
  # 打印
  print('来自[%s:%s]的消息: %s' % (addr[0], addr[1], msg.decode('utf-8')))

  # 等待输入
  inp = input('>>>')
  # 发送数据报
  sk.sendto(inp.encode('utf-8'), addr)

# 关闭 socket
sk.close()

代码首先创建 Socket,然后绑定本机 6000 端口,并等待接收客户端发送的数据报。接收到数据后,将内容打印至控制台。随后,用户可在控制台输入回复内容,并发送给客户端。

客户端代码如下:


import socket

# 创建 socket
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('127.0.0.1', 6000)
while True:
  # 等待输入
  msg = input('>>>')
  # 发送数据报
  sk.sendto(msg.encode('utf-8'), addr)
  # 接收数据报
  msg_recv, addr = sk.recvfrom(1024)
  # 打印
  print(msg_recv.decode('utf-8'))

# 关闭 socket
sk.close()

在客户端代码中,我们仅创建 Socket,然后在控制台输入需发送给服务器的内容,通过 sendto() 方法发送。接着接收服务器返回的内容,并将接收到的内容打印至控制台。

分别运行客户端和服务器代码后,在客户端控制台输入“hello server”,服务器控制台将打印出客户端发送的内容。接着在服务器控制台输入“hello client”,客户端控制台同样会显示该内容。

以下是客户端的控制台输出内容:


>>>hello server
hello client
>>>

以下是服务器的控制台输出内容:


来自[127.0.0.1:61207]的消息: hello server
>>>hello client

该实例实际上是一个简易的聊天模型,客户端与服务器如同两人对话,可以互相发送和接收信息。

那么如何实现多人群聊呢?简单来说,我们需要设置一台中心服务器。所有用户发送的内容先发送至中心服务器,再由服务器转发给群聊中的其他成员。

总结

本文介绍了 UDP 编程的基本原理,并通过 Python 实现了一个最简单的聊天程序来模拟 UDP 通信过程。通过学习,读者应对 UDP 协议有基本认识,并熟悉其通信流程。

以上是关于 Python UDP 编程的详细内容,更多相关技术文章请关注本站其他资源。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。