feat(server): 增加端口占用自动检测和递增功能
当服务器启动时指定的端口被占用时,会自动检测并尝试使用下一个可用端口,避免因端口冲突导致启动失败。 同时,更新了 NapCat 适配器插件,使其能够从全局服务器实例中获取正确的地址和端口,确保与核心服务器的通信。
This commit is contained in:
@@ -1,19 +1,22 @@
|
|||||||
import os
|
import os
|
||||||
|
import socket
|
||||||
from fastapi import APIRouter, FastAPI
|
from fastapi import APIRouter, FastAPI
|
||||||
from fastapi.middleware.cors import CORSMiddleware # 新增导入
|
from fastapi.middleware.cors import CORSMiddleware # 新增导入
|
||||||
from rich.traceback import install
|
from rich.traceback import install
|
||||||
from uvicorn import Config
|
from uvicorn import Config, Server as UvicornServer
|
||||||
from uvicorn import Server as UvicornServer
|
|
||||||
|
from src.common.logger import get_logger
|
||||||
|
|
||||||
install(extra_lines=3)
|
install(extra_lines=3)
|
||||||
|
|
||||||
|
logger = get_logger("Server")
|
||||||
|
|
||||||
|
|
||||||
class Server:
|
class Server:
|
||||||
def __init__(self, host: str | None = None, port: int | None = None, app_name: str = "MaiMCore"):
|
def __init__(self, host: str | None = None, port: int | None = None, app_name: str = "MaiMCore"):
|
||||||
self.app = FastAPI(title=app_name)
|
self.app = FastAPI(title=app_name)
|
||||||
self._host: str = "127.0.0.1"
|
self.host: str = "127.0.0.1"
|
||||||
self._port: int = 8080
|
self.port: int = 8080
|
||||||
self._server: UvicornServer | None = None
|
self._server: UvicornServer | None = None
|
||||||
self.set_address(host, port)
|
self.set_address(host, port)
|
||||||
|
|
||||||
@@ -60,14 +63,23 @@ class Server:
|
|||||||
def set_address(self, host: str | None = None, port: int | None = None):
|
def set_address(self, host: str | None = None, port: int | None = None):
|
||||||
"""设置服务器地址和端口"""
|
"""设置服务器地址和端口"""
|
||||||
if host:
|
if host:
|
||||||
self._host = host
|
self.host = host
|
||||||
if port:
|
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):
|
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 默认日志和访问日志
|
# 禁用 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)
|
self._server = UvicornServer(config=config)
|
||||||
try:
|
try:
|
||||||
await self._server.serve()
|
await self._server.serve()
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
from maim_message import Router, RouteConfig, TargetConfig
|
from maim_message import Router, RouteConfig, TargetConfig
|
||||||
|
|
||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
import os
|
from src.common.server import get_global_server
|
||||||
from .send_handler import send_handler
|
|
||||||
from src.plugin_system.apis import config_api
|
from src.plugin_system.apis import config_api
|
||||||
|
|
||||||
|
from .send_handler import send_handler
|
||||||
|
|
||||||
logger = get_logger("napcat_adapter")
|
logger = get_logger("napcat_adapter")
|
||||||
|
|
||||||
router = None
|
router = None
|
||||||
@@ -13,8 +15,9 @@ def create_router(plugin_config: dict):
|
|||||||
"""创建路由器实例"""
|
"""创建路由器实例"""
|
||||||
global router
|
global router
|
||||||
platform_name = config_api.get_plugin_config(plugin_config, "maibot_server.platform_name", "qq")
|
platform_name = config_api.get_plugin_config(plugin_config, "maibot_server.platform_name", "qq")
|
||||||
host = os.getenv("HOST", "127.0.0.1")
|
server = get_global_server()
|
||||||
port = os.getenv("PORT", "8000")
|
host = server.host
|
||||||
|
port = server.port
|
||||||
logger.debug(f"初始化MaiBot连接,使用地址:{host}:{port}")
|
logger.debug(f"初始化MaiBot连接,使用地址:{host}:{port}")
|
||||||
route_config = RouteConfig(
|
route_config = RouteConfig(
|
||||||
route_config={
|
route_config={
|
||||||
|
|||||||
Reference in New Issue
Block a user