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

如何手动关闭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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:40:50