如何让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
相关产品推荐
相关产品推荐

