如何手动关闭Socket服务器?终端输入shutdown实现关闭方案
实现Socket服务器终端输入"shutdown"关闭功能
你的原代码里server.accept()是阻塞操作,主线程会一直卡在这,没法处理终端输入。要实现终端输入关闭的功能,需要用多线程拆分逻辑:一个线程负责监听客户端连接,主线程专门监听终端输入,收到"shutdown"后触发服务器关闭流程。
以下是修改后的完整代码:
import socket import threading SERVER = "xxxx" PORT = 1234 ADDR = (SERVER, PORT) FORMAT = "utf-8" # 创建关闭信号事件,用于通知子线程停止运行 shutdown_event = threading.Event() server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDR) def handle_connection(conn, addr): try: print(f"新连接: {addr}") # 这里写你的连接处理逻辑,比如接收发送数据 while not shutdown_event.is_set(): data = conn.recv(1024).decode(FORMAT) if not data: break print(f"收到{addr}的数据: {data}") # 示例:返回响应 conn.send("已收到消息".encode(FORMAT)) finally: conn.close() print(f"连接{addr}已关闭") def listen_clients(): server.listen() print(f"服务器已启动,监听{ADDR}") while not shutdown_event.is_set(): try: # 设置超时,避免一直阻塞在accept,能及时检测关闭信号 server.settimeout(1) conn, addr = server.accept() # 每个连接用单独线程处理(按需调整) client_thread = threading.Thread(target=handle_connection, args=(conn, addr)) client_thread.start() except socket.timeout: # 超时仅用于循环检查关闭信号,无需额外处理 continue # 关闭服务器套接字 server.close() print("服务器已关闭") # 启动监听客户端的子线程 client_listen_thread = threading.Thread(target=listen_clients) client_listen_thread.start() # 主线程监听终端输入 while True: cmd = input("输入shutdown关闭服务器: ") if cmd.strip().lower() == "shutdown": shutdown_event.set() client_listen_thread.join() break
关键逻辑说明:
- 用
threading.Event()做关闭信号,子线程循环检查信号状态,一旦触发就停止运行 - 给
server.accept()设置1秒超时,避免线程一直阻塞,能定期检测关闭信号 - 主线程专注处理终端输入,收到指令后触发关闭信号,等待子线程完成清理再退出
- 客户端连接用单独线程处理,可根据业务需求调整为单线程处理模式
内容的提问来源于stack exchange,提问作者Michael Xia
相关产品推荐
相关产品推荐

