如何修改Python UDP Socket代码实现双方无需等待即可互发消息?
实现UDP Socket双向异步消息收发的修改方案
原代码的核心问题是单线程串行执行逻辑:服务器必须先收到客户端消息才能发送,客户端必须先发送消息才能等待接收,导致无法随时主动发送消息。要解决这个问题,需要将接收消息和发送消息的逻辑拆分到两个独立线程,让两者并行运行,互不阻塞。
服务器端修改
引入threading模块,创建专门的接收线程,主线程负责处理输入和发送:
import socket import threading def receive_messages(sock): while True: data, addr = sock.recvfrom(4096) print(f"\nClient says: {data.decode('utf-8')}") print("Enter message here: ", end="") # 避免接收消息打断输入提示 # 初始化socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('127.0.0.1', 12345)) # 启动接收线程(守护线程,主程序退出时自动终止) recv_thread = threading.Thread(target=receive_messages, args=(sock,), daemon=True) recv_thread.start() # 主线程负责发送消息 while True: message = input("Enter message here: ") try: sock.sendto(message.encode('utf-8'), addr) except NameError: print("No client connected yet, wait for client to send first message.")
关键改动:
- 拆分接收逻辑到独立线程,避免阻塞发送流程
- 接收消息后重新打印输入提示,保证输入体验流畅
- 使用守护线程确保主程序退出时线程自动结束
客户端修改
同样用多线程拆分接收和发送逻辑:
import socket import threading def receive_messages(client_socket): while True: data, addr = client_socket.recvfrom(4096) print(f"\nServer says: {data.decode('utf-8')}") print("Enter your message here: ", end="") # 初始化socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 12345) # 启动接收线程 recv_thread = threading.Thread(target=receive_messages, args=(client_socket,), daemon=True) recv_thread.start() # 主线程负责发送消息 while True: msg = input("Enter your message here: ") client_socket.sendto(msg.encode('utf-8'), server_addr)
关键改动:
- 独立线程处理接收逻辑,主线程专注用户输入和发送
- 接收消息后重置输入提示,避免交互混乱
修改完成后,服务器和客户端均可随时输入并发送消息,同时实时接收对方消息,无需等待对方回复即可操作。
内容的提问来源于stack exchange,提问作者mcoder
相关产品推荐
相关产品推荐

