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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:40:47