Python套接字编程完全指南:TCP/UDP实战教程 | 网络编程入门
- Python
- 2025-07-20
- 281
Python套接字编程完全指南
从基础概念到TCP/UDP实战应用,掌握网络编程核心技能
什么是套接字(Socket)?
套接字(Socket)是网络通信的基础构建块,允许不同主机或同一主机上的进程之间进行通信。在Python中,我们通过内置的socket
模块实现套接字编程。
套接字的核心概念:
- TCP(传输控制协议):面向连接的可靠协议,保证数据顺序和完整性
- UDP(用户数据报协议):无连接的轻量协议,传输速度快但不保证可靠性
- IP地址:设备的网络标识符
- 端口:应用程序的通信端点(0-65535)
TCP套接字编程
TCP套接字提供可靠的、面向连接的通信,适用于文件传输、Web请求等需要可靠性的场景。
TCP服务器端代码示例:
import socket # 创建TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_address = ('localhost', 12345) server_socket.bind(server_address) # 监听连接 server_socket.listen(1) print("服务器启动,等待连接...") # 接受客户端连接 client_socket, client_address = server_socket.accept() print(f"连接来自: {client_address}") try: while True: # 接收数据 data = client_socket.recv(1024) if not data: break print(f"收到数据: {data.decode()}") # 发送响应 response = f"已收到 {len(data)} 字节数据" client_socket.sendall(response.encode()) finally: # 关闭连接 client_socket.close() server_socket.close()
TCP客户端代码示例:
import socket # 创建TCP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_address = ('localhost', 12345) client_socket.connect(server_address) try: # 发送数据 message = "你好,TCP服务器!" client_socket.sendall(message.encode()) # 接收响应 data = client_socket.recv(1024) print(f"收到响应: {data.decode()}") finally: # 关闭连接 client_socket.close()
UDP套接字编程
UDP套接字提供无连接的通信,速度快但不可靠,适用于实时应用如视频流、在线游戏等。
UDP服务器端代码示例:
import socket # 创建UDP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定地址和端口 server_address = ('localhost', 12345) server_socket.bind(server_address) print("UDP服务器启动,等待数据...") while True: # 接收数据和客户端地址 data, client_address = server_socket.recvfrom(1024) print(f"收到来自 {client_address} 的数据: {data.decode()}") # 发送响应 response = f"已收到 {len(data)} 字节数据" server_socket.sendto(response.encode(), client_address)
UDP客户端代码示例:
import socket # 创建UDP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 服务器地址 server_address = ('localhost', 12345) # 发送数据 message = "你好,UDP服务器!" client_socket.sendto(message.encode(), server_address) # 接收响应 data, server = client_socket.recvfrom(1024) print(f"收到响应: {data.decode()}") # 关闭套接字 client_socket.close()
套接字编程最佳实践
错误处理
使用try-except块捕获和处理套接字错误:
try: # 套接字操作 except socket.error as e: print(f"套接字错误: {e}") except Exception as e: print(f"其他错误: {e}")
资源管理
使用上下文管理器(with语句)确保套接字正确关闭:
with socket.socket() as s: s.bind(('localhost', 12345)) # 执行操作 # 退出时自动关闭
超时设置
设置超时防止阻塞操作无限期等待:
client_socket.settimeout(5.0) # 5秒超时 try: data = client_socket.recv(1024) except socket.timeout: print("接收数据超时")
常见问题解答
1. TCP和UDP的主要区别是什么?
TCP是面向连接的可靠协议,保证数据顺序和完整性,适合文件传输、网页浏览等。UDP是无连接的轻量协议,不保证可靠性但速度快,适合实时应用如视频流、在线游戏。
2. 如何选择TCP或UDP?
需要可靠传输时选择TCP,追求速度和实时性时选择UDP。对于大多数应用,TCP是更安全的选择。
3. 如何处理多个客户端连接?
可以使用多线程、多进程或异步I/O(如asyncio)处理多个客户端。对于高并发场景,推荐使用异步编程模型。
4. 为什么需要调用bind()方法?
bind()方法将套接字关联到特定的网络接口和端口号,服务器必须绑定到已知端口,客户端通常由系统自动分配端口。
5. 如何解决"Address already in use"错误?
设置套接字选项SO_REUSEADDR允许重用地址:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
本文由LongGuan于2025-07-20发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256065.html
发表评论