如何在不干扰客户端持续发数据时实现服务器主动推送数据
解决方案:用多线程实现并发接收与发送
你的问题核心在于input()是阻塞式操作,会卡住主循环,导致无法及时接收客户端每2秒发来的数据。我们可以通过多线程把接收客户端数据和读取用户输入发送数据的操作拆分开,让两者并行执行,互不干扰。
修改后的代码示例
import socket import threading def receive_data(conn): """持续接收客户端数据的线程""" global running while running: try: data = conn.recv(1024).decode() if not data: print("客户端连接已关闭") running = False break print(f"从客户端收到: {data}") except Exception as e: print(f"接收数据出错: {e}") running = False break def send_data(conn): """读取用户输入并发送给客户端的线程""" global running while running: try: data = input(' -> ') if data.lower() == 'exit': running = False break conn.send(data.encode()) except Exception as e: print(f"发送数据出错: {e}") break # 初始化服务器 host = socket.gethostname() port = 5000 server_socket = socket.socket() server_socket.bind((host, port)) server_socket.listen(2) print(f"服务器启动,等待客户端连接...") conn, address = server_socket.accept() print(f"连接来自: {str(address)}") running = True # 启动两个线程 recv_thread = threading.Thread(target=receive_data, args=(conn,)) send_thread = threading.Thread(target=send_data, args=(conn,)) recv_thread.start() send_thread.start() # 等待线程结束 recv_thread.join() send_thread.join() # 关闭连接 conn.close() server_socket.close() print("服务器已关闭")
代码说明
- 接收线程:专门循环监听客户端数据,不受用户输入操作阻塞,确保客户端每2秒的发送都能被及时处理。
- 发送线程:独立处理用户输入,输入内容会立即发送给客户端;即使没有输入,也不会影响接收线程的运行。
- 全局控制变量
running:统一管理两个线程的退出逻辑——无论是客户端断开连接,还是用户输入exit,两个线程都会同步终止,随后关闭服务器连接。
其他可选方案
如果不想用线程,也可以用select模块实现IO多路复用,或者用asyncio异步编程模型,但对于这个简单场景,多线程是最直观、易实现的方案。
内容的提问来源于stack exchange,提问作者Muhammed
相关产品推荐
相关产品推荐

