Python基于socket实现UDP与TCP网络通信的示例详解

陆遥
陆遥
发布时间:2026-10-12 | 2人浏览过
原创

本文详细介绍如何使用Python内置的socket模块实现UDP和TCP两种常见网络通信协议。通过完整的收发端示例代码,对比两者的工作原理、适用场景及数据包大小限制设置,帮助开发者快速掌握本地或局域网环境下的基础网络编程方法。

UDP协议通信实现与注意事项

UDP(User Datagram Protocol)是一种无连接、不可靠的传输协议。相比TCP,它省去了三次握手和状态维护的开销,因此数据传输延迟更低、吞吐量更大,但不会自动保证数据完整送达,丢包或乱序需由应用层自行处理。

下面分别展示使用socket模块进行UDP发送与接收的基础代码:

第1步:编写UDP发送端脚本

目的:向指定IP和端口投递数据报文。
入口:终端或IDE运行Python脚本。
动作:创建类型为SOCK_DGRAM的套接字,调用sendto()发送字节流。
参数:IP设为回环地址'127.0.0.1'或局域网IP,端口避开系统保留范围(推荐1024以上)。
完成状态:控制台无异常抛出,网络抓包工具可见单条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()
    

第2步:编写UDP接收端脚本

目的:监听指定端口并捕获传入的数据报文。
入口:提前运行接收脚本保持后台驻留。
动作:绑定地址与端口后,使用recvfrom()阻塞等待数据。
参数:recvfrom(1024)指定单次最大读取缓冲为1024字节。
完成状态:控制台打印出发送端传来的原始字节内容,套接字正常释放。

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环境下理论最大长度为64KB(含头部),但受路由器MTU和防火墙策略影响,实际有效载荷通常较小。若需查询当前系统允许的最大发送缓冲区,可使用getsockopt():

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")
    

TCP协议通信实现与流程

TCP(Transmission Control Protocol)是面向连接、可靠的传输协议。它通过三次握手建立连接,提供流量控制、拥塞控制和数据重传机制,适合对数据完整性要求高的场景,但会带来更高的延迟和CPU消耗。

第3步:搭建TCP服务端

目的:监听端口并接受客户端连接请求。
入口:独立服务器窗口执行。
动作:创建SOCK_STREAM套接字,绑定后开启监听,使用accept()获取连接对象进行双向通信。
参数:listen(1)设置未完成握手队列最大长度为1。
完成状态:打印Connected by信息,成功接收客户端消息并回发确认数据。

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()
    

第4步:编写TCP客户端

目的:主动连接服务端并交换数据。
入口:任意客户端设备执行。
动作:调用connect()完成握手,随后直接读写sock对象即可。
参数:IP与PORT需与服务端保持一致。
完成状态:控制台打印出服务端回传的Hello, Client!字样,连接安全断开。

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通信严格依赖连接生命周期:建立→传输→关闭。若需支持高并发,可结合threading或asyncio模块扩展,本示例聚焦最核心的API调用逻辑。

运行验证与排错建议

测试时需留意以下常见问题:
- 端口冲突:若报错[Errno 48] Address already in use,说明端口被其他进程占用,请更换PORT参数。
- 防火墙拦截:macOS/Linux默认放行回环地址,Windows主机若跨网段通信可能需手动开放对应端口入站规则。
- 编码格式:示例中使用了.decode()将字节转为UTF-8字符串,实际业务请根据协议约定指定编码方式,避免UnicodeDecodeError。

以上就是Python基于socket实现UDP与TCP网络通信的详细内容,更多关于Python网络编程与协议配置的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表