From fb922ede39248e8b6bc92be09df6c9187505b9bd Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 11 Oct 2025 20:31:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(server):=20=E5=A2=9E=E5=8A=A0=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E5=8D=A0=E7=94=A8=E8=87=AA=E5=8A=A8=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=92=8C=E9=80=92=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当服务器启动时指定的端口被占用时,会自动检测并尝试使用下一个可用端口,避免因端口冲突导致启动失败。 同时,更新了 NapCat 适配器插件,使其能够从全局服务器实例中获取正确的地址和端口,确保与核心服务器的通信。 --- src/common/server.py | 28 +++++++++++++------ .../src/mmc_com_layer.py | 11 +++++--- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/common/server.py b/src/common/server.py index ec6ff932a..e5802e778 100644 --- a/src/common/server.py +++ b/src/common/server.py @@ -1,19 +1,22 @@ import os - +import socket from fastapi import APIRouter, FastAPI from fastapi.middleware.cors import CORSMiddleware # 新增导入 from rich.traceback import install -from uvicorn import Config -from uvicorn import Server as UvicornServer +from uvicorn import Config, Server as UvicornServer + +from src.common.logger import get_logger install(extra_lines=3) +logger = get_logger("Server") + class Server: def __init__(self, host: str | None = None, port: int | None = None, app_name: str = "MaiMCore"): self.app = FastAPI(title=app_name) - self._host: str = "127.0.0.1" - self._port: int = 8080 + self.host: str = "127.0.0.1" + self.port: int = 8080 self._server: UvicornServer | None = None self.set_address(host, port) @@ -60,14 +63,23 @@ class Server: def set_address(self, host: str | None = None, port: int | None = None): """设置服务器地址和端口""" if host: - self._host = host + self.host = host if port: - self._port = port + self.port = port + + def _is_port_in_use(self, port: int): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + return s.connect_ex(("127.0.0.1", port)) == 0 async def run(self): """启动服务器""" + while self._is_port_in_use(self.port): + logger.warning(f"端口 {self.port} 已被占用,正在尝试下一个端口...") + self.port += 1 + + logger.info(f"将在 http://{self.host}:{self.port} 上启动服务器") # 禁用 uvicorn 默认日志和访问日志 - config = Config(app=self.app, host=self._host, port=self._port, log_config=None, access_log=False) + config = Config(app=self.app, host=self.host, port=self.port, log_config=None, access_log=False) self._server = UvicornServer(config=config) try: await self._server.serve() diff --git a/src/plugins/built_in/napcat_adapter_plugin/src/mmc_com_layer.py b/src/plugins/built_in/napcat_adapter_plugin/src/mmc_com_layer.py index 2e4a8390f..95d6dc567 100644 --- a/src/plugins/built_in/napcat_adapter_plugin/src/mmc_com_layer.py +++ b/src/plugins/built_in/napcat_adapter_plugin/src/mmc_com_layer.py @@ -1,9 +1,11 @@ from maim_message import Router, RouteConfig, TargetConfig + from src.common.logger import get_logger -import os -from .send_handler import send_handler +from src.common.server import get_global_server from src.plugin_system.apis import config_api +from .send_handler import send_handler + logger = get_logger("napcat_adapter") router = None @@ -13,8 +15,9 @@ def create_router(plugin_config: dict): """创建路由器实例""" global router platform_name = config_api.get_plugin_config(plugin_config, "maibot_server.platform_name", "qq") - host = os.getenv("HOST", "127.0.0.1") - port = os.getenv("PORT", "8000") + server = get_global_server() + host = server.host + port = server.port logger.debug(f"初始化MaiBot连接,使用地址:{host}:{port}") route_config = RouteConfig( route_config={