You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不干扰客户端持续发数据时实现服务器主动推送数据

解决方案:用多线程实现并发接收与发送

你的问题核心在于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:25:19