# -*- coding: utf-8 -*- """启动一个无界面的被控端,供 Java 客户端联调测试使用。 用法: python run_stub_server.py --port 8799 --code-file 启动后会把配对码写入 code-file,并持续运行直到被终止。 """ from __future__ import annotations import argparse import sys import tempfile import threading import time from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) from stub_support import StubUI, make_stub_actions # noqa: E402 from lanremote.config import Store # noqa: E402 from lanremote.server import RemoteServer # noqa: E402 def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--port", type=int, default=8799) parser.add_argument("--code-file", required=True) parser.add_argument("--data-dir") args = parser.parse_args() data = Path(args.data_dir) if args.data_dir else Path(tempfile.mkdtemp(prefix="lr_stub_")) store = Store(data) store.set("port", args.port) store.set("allow_run", True) store.set("allow_power", True) # 固定配对码,便于联调复现 store.settings["pairing_code"] = "246813" store.save_settings() ui = StubUI() server = RemoteServer(store, make_stub_actions(ui, store), ui=ui) server.start() # 把替身界面收到的日志实时打到 stdout,便于联调时核对 def log_dumper() -> None: seen = 0 while True: time.sleep(0.3) while seen < len(ui.logs): print(f"SRVLOG {ui.logs[seen]}", flush=True) seen += 1 threading.Thread(target=log_dumper, daemon=True).start() Path(args.code_file).write_text("246813", encoding="utf-8") print(f"STUB_READY port={args.port} code=246813", flush=True) # 模拟「用户在电脑上自己复制了东西」,用于验证服务端主动推送通道。 # 注意:客户端自己调用 clip_set 设置的内容不会回推(避免回声), # 所以必须由本地侧产生变化才能触发 clip 事件。 stop_flag = threading.Event() def clip_churner() -> None: counter = 0 while not stop_flag.is_set(): time.sleep(3.0) counter += 1 ui.clipboard = f"PC本地复制的内容-{counter}" threading.Thread(target=clip_churner, daemon=True).start() try: while True: time.sleep(1.0) except KeyboardInterrupt: pass finally: stop_flag.set() server.stop() return 0 if __name__ == "__main__": sys.exit(main())