diff --git a/config/settings.py b/config/settings.py index ef6056c..9655b0b 100644 --- a/config/settings.py +++ b/config/settings.py @@ -17,6 +17,7 @@ DEFAULT_CONFIG: dict[str, Any] = { "theme": "dark", "sidebar_collapsed": False, "telemetry_port": 20777, + "tcp_port": 20778, "use_unified_port": True, "game_ports": {}, "ui_test_mode": False, diff --git a/server/telemetry/listener.py b/server/telemetry/listener.py index b9ffb09..718e7f6 100644 --- a/server/telemetry/listener.py +++ b/server/telemetry/listener.py @@ -107,13 +107,32 @@ class TelemetryListener: self._current_protocol = "udp" if self._current_protocol == "tcp": - self._tcp = TCPListener(self._handle_packet) - ok = await self._tcp.start(host, port) - if ok: + import json as _json + mode = "server" + tcp_path = "/" + if selected_game: + gp = game_plugin_manager.get(selected_game) + if gp and gp.manifest_path: + try: + with open(f"{gp.manifest_path}/manifest.json", "r") as f: + m = _json.load(f) + mode = m.get("mode", "server") + tcp_path = m.get("path", "/") + except Exception: + pass + + if mode == "server": + self._tcp = TCPListener(self._handle_packet) + ok = await self._tcp.start(host, port) + if ok: + self._running = True + self.forwarder.reload_targets() + logger.info("TCP server started on %s:%d [game=%s]", host, port, selected_game or "none") + return ok + else: + logger.info("TCP client mode - awaiting manual connection to upstream") self._running = True - self.forwarder.reload_targets() - logger.info("TCP listener started on %s:%d [game=%s]", host, port, selected_game or "none") - return ok + return True else: loop = asyncio.get_event_loop() try: diff --git a/static/js/pages/settings.js b/static/js/pages/settings.js index 9fd030f..7ea62dd 100644 --- a/static/js/pages/settings.js +++ b/static/js/pages/settings.js @@ -221,7 +221,12 @@ const PageSettings = { _gamePortListHtml(games, cfg) { const gamePorts = cfg.game_ports || {}; - return games.map(g => '
' + g.name + '默认: ' + (g.default_port || 20777) + '
').join(''); + return games.map(g => { + const proto = g.protocol || 'udp'; + const mode = g.mode || (proto === 'tcp' ? 'server' : ''); + const protoLabel = proto.toUpperCase() + (mode ? '/' + mode : ''); + return '
' + g.name + '' + protoLabel + '默认: ' + (g.default_port || (proto==='tcp'?cfg.tcp_port||20778:20777)) + '
'; + }).join(''); }, _forwardListHtml(forwards) {