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

如何让Python Socket服务器永久运行?解决客户端断开即终止问题

让你的Python Socket服务器永久运行的解决方案

嘿,问题很清晰——你的服务器现在只能处理一个客户端连接,当这个客户端断开后,程序就执行完所有代码退出了。要让它一直运行、持续接受新的客户端连接,只需要把接受连接的逻辑放到一个无限循环里就行,我来给你详细拆解:

问题根源

你当前的代码只调用了一次s.accept(),这意味着服务器只会等待并处理第一个客户端请求,当这个客户端断开后,程序没有后续逻辑支撑,自然就关闭了。

修改后的完整代码

import socket

HOST = ''
PORT = 8000

# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
# 设置监听,允许最大5个等待连接的队列(这个数字可以按需调整)
s.listen(5)
print(f"服务器已启动,监听端口 {PORT},等待客户端连接...")

# 外层无限循环:持续接受新的客户端连接
while True:
    # 等待客户端连接,这一步会阻塞直到有新客户端进来
    conn, addr = s.accept()
    print('Connected by', addr)
    
    # 用with块自动管理连接:客户端断开时自动关闭conn
    with conn:
        # 内层循环:处理当前客户端的消息交互
        while True:
            try:
                data = conn.recv(1024)
                # 如果没有收到数据,说明客户端正常断开了
                if not data:
                    print(f"客户端 {addr} 断开连接")
                    break
                print(f"收到来自 {addr} 的数据: {data.decode()}")
                # 回复客户端消息
                conn.sendall('HelloClient'.encode())
            except ConnectionResetError:
                # 处理客户端异常断开的情况(比如强制关闭程序)
                print(f"客户端 {addr} 异常断开")
                break

关键修改点说明

  • 外层无限循环:把s.accept()放到while True里,这样处理完一个客户端后,服务器会立刻回到等待新连接的状态,不会退出程序。
  • 异常捕获:添加try-except捕获ConnectionResetError,防止客户端突然断开导致服务器抛出异常崩溃。
  • 明确的断开处理:当recv()返回空数据时,主动跳出内层循环,with块会自动关闭当前连接,服务器回到外层循环等待新客户端。

这样你的服务器就能一直保持运行状态,不断接受新的客户端连接啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:03