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

Socket聊天室send_message循环阻塞问题求助(Python)

解决Socket聊天室input阻塞及服务器响应接收问题

问题核心

你的代码存在两个关键问题:

  1. input()是阻塞式调用,会卡住整个send_messages循环,必须输入完成才能继续执行后续逻辑。
  2. 同步调用send_message(user_input)会等待服务器响应返回,进一步加剧阻塞;同时后续启动线程重复发送同一条消息,属于冗余且错误的操作。

解决方案:拆分输入/发送与接收逻辑到独立线程

把用户输入+消息发送和服务器响应接收拆分成两个独立线程并行运行,这样input()的阻塞就不会影响接收服务器消息。

完整代码示例

import threading
import socket

def receive_messages(sock):
    """专门负责接收服务器响应的线程函数"""
    while True:
        try:
            # 接收服务器消息(缓冲区大小可根据需求调整)
            response = sock.recv(1024).decode('utf-8')
            if not response:
                print("服务器已断开连接")
                break
            print(f"服务器响应: {response}")
        except Exception as e:
            print(f"接收消息出错: {str(e)}")
            break

def send_messages(sock):
    """专门负责读取用户输入并发送消息的函数"""
    while True:
        user_input = input("Enter a message: ")
        if user_input.lower() == 'exit':
            sock.close()
            print("已退出聊天室")
            break
        try:
            sock.send(user_input.encode('utf-8'))
        except Exception as e:
            print(f"发送消息出错: {str(e)}")
            break

def main():
    # 替换为你的服务器地址和端口
    host = 'localhost'
    port = 12345
    
    # 创建Socket连接
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    
    # 启动接收消息的守护线程(主程序退出时自动终止)
    threading.Thread(target=receive_messages, args=(sock,), daemon=True).start()
    
    # 启动发送消息逻辑(这里可以不用额外线程,因为send_messages本身是循环,放在主线程也可)
    send_messages(sock)

if __name__ == "__main__":
    main()

关键说明

  • 接收线程:独立运行,持续监听服务器发来的消息,不会被input()阻塞,能实时打印服务器响应。
  • 发送逻辑:专注读取用户输入并发送消息,input()的阻塞只会影响发送操作本身,不影响接收。
  • 原代码修正:移除了同步调用send_message的冗余逻辑,避免重复发送消息和阻塞循环。

内容的提问来源于stack exchange,提问作者AlexanderWaller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:15:00