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

使用Python 3.6开发聊天程序时无法保持连接的技术问询

排查Python聊天程序无法保持连接的问题

我帮你梳理了服务端代码里的关键问题,这两个点直接导致了连接无法持续:

问题1:用错了收发消息的套接字

你在接收客户端消息时写了server.recv(bufsize),但server是监听套接字——它的职责只是等待并接受新的连接请求,根本不负责和已连接的客户端通信。真正用来和客户端收发消息的,应该是server.accept()返回的client套接字。

问题2:没有维持与客户端的持续交互

你的代码在处理完一次消息后,直接跳回外层循环等待新连接,没有针对当前客户端做持续通信的逻辑,所以连接会在单次消息传递后直接断开。

修正后的服务端代码

import socket
host = '0.0.0.0'  # 改为0.0.0.0可监听所有网卡,也可填实际目标地址
port = 50000
bufsize = 1024

server = socket.socket()
server.bind((host, port))
server.listen(5)
print("服务已启动,等待客户端连接...")

while True:
    print("\n等待新连接接入")
    client, address = server.accept()
    print(f"已连接客户端:{address}")
    
    # 发送欢迎提示
    welcomemsg = "请发送消息(输入'exit'可断开连接)"
    client.send(bytes(welcomemsg, "utf-8"))
    
    # 新增内层循环,维持与当前客户端的持续通信
    while True:
        try:
            # 使用client套接字接收消息
            msgfromclient = client.recv(bufsize).decode("utf8")
            # 判断客户端是否主动断开或发送退出指令
            if not msgfromclient or msgfromclient.lower() == 'exit':
                print(f"客户端{address}已断开连接")
                client.close()
                break
            
            print(f"收到{address}的消息:{msgfromclient}")
            # 回显消息给客户端
            client.send(bytes(f"已收到:{msgfromclient}", "utf-8"))
        except ConnectionResetError:
            print(f"客户端{address}意外断开连接")
            client.close()
            break

关键修改说明

  • 将server.recv()替换为client.recv(),确保用正确的套接字和客户端通信
  • 新增内层while True循环,实现与当前客户端的持续消息交互,直到客户端主动断开或连接异常
  • 添加了断开连接的判断逻辑和异常捕获,处理客户端主动退出、意外断开等场景
  • 优化了控制台输出信息,方便调试时查看连接状态

修改后服务端就能和客户端保持长连接,持续收发消息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:52