# -*- coding: utf-8 -*- r"""修:中转连接尝试阻塞了局域网发现。 现象(agent 日志): [20:31:17] 没配过中转地址,用内置默认值:192.168.10.105:8080;https://... [20:31:25] http://192.168.10.105:8080 不通,试下一个 <- 等了 8 秒 [20:31:27] https://relay.xxmxxs.top 不通,试下一个 <- 又 2 秒 [20:31:27] 自动发现已开启(UDP 8766) <- 10 秒后才绑上 server.start() 原来的顺序: 1. 绑 TCP 2. enable_relay() <- 挨个试中转地址,每个都要等超时(这里 10 秒) 3. 起 accept 线程 4. 起 DiscoveryResponder 问题:**局域网发现被中转拖住了**。 电脑和手表在同一个 WiFi 时,本来应该"广播一下就找到", 结果因为中转连不上,要等 10 几秒手表才搜得到电脑。 中转地址越烂、候选越多,等得越久。 影响: * 用户体验上表现为"刚开电脑时手表搜不到,过一会儿才行" * 自动化测试也栽在这(广播时发现服务还没起) 改法:把局域网发现**提到 enable_relay() 之前**。 局域网是本机能力,不该依赖任何网络外部条件。 """ from __future__ import annotations import ast import sys from pathlib import Path SERVER = (Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\windows" r"\lanremote\server.py")) OLD = ''' # 配了中转地址就同时启用跨网络通道(和局域网监听并存,不冲突) try: self.enable_relay() except Exception as exc: # noqa: BLE001 self._log(f"启用中转失败:{exc}") self._accept_thread = threading.Thread(target=self._accept_loop, name="accept", daemon=True) self._accept_thread.start() self._clip_thread = threading.Thread(target=self._clip_loop, name="clip", daemon=True) self._clip_thread.start() # 启动局域网自动发现,让手表不用输 IP self._discovery = DiscoveryResponder(self.store, self.port) # 手表点「连不上?」会广播请求,这里就把网络自检窗口弹出来 self._discovery.on_selfcheck = self._on_selfcheck_request if self._discovery.start(): self._log(f"自动发现已开启(UDP {DISCOVERY_PORT})") else: self._log(f"自动发现未开启:{self._discovery.last_error}")''' NEW = ''' # ── 先起局域网发现 ── # # 顺序很重要:enable_relay() 会挨个试中转地址, # 每个候选都要等到超时才算"不通",地址越烂等得越久(实测 10 秒+)。 # 原来这一步排在发现服务前面,导致: # 电脑刚开机的十几秒里,手表广播搜不到它。 # 局域网发现是纯本机能力,不该被"连不连得上外网"拖住, # 所以挪到前面,开机即可被搜到。 self._discovery = DiscoveryResponder(self.store, self.port) # 手表点「连不上?」会广播请求,这里就把网络自检结论算出来 self._discovery.on_selfcheck = self._on_selfcheck_request if self._discovery.start(): self._log(f"自动发现已开启(UDP {DISCOVERY_PORT})") else: self._log(f"自动发现未开启:{self._discovery.last_error}") # ── 再起收发线程 ── self._accept_thread = threading.Thread(target=self._accept_loop, name="accept", daemon=True) self._accept_thread.start() self._clip_thread = threading.Thread(target=self._clip_loop, name="clip", daemon=True) self._clip_thread.start() # ── 最后才连中转(会阻塞,所以放最后)── # 配了中转地址就同时启用跨网络通道(和局域网监听并存,不冲突) try: self.enable_relay() except Exception as exc: # noqa: BLE001 self._log(f"启用中转失败:{exc}")''' def main() -> int: text = SERVER.read_text(encoding="utf-8") if "先起局域网发现" in text: print(" 已经改过") return 0 if OLD not in text: print(" [失败] 锚点没找到") return 1 text = text.replace(OLD, NEW, 1) SERVER.write_text(text, encoding="utf-8", newline="\n") print(" 已把局域网发现提到 enable_relay() 之前") try: ast.parse(text) print(" server.py 语法 OK") except SyntaxError as exc: print(f" 语法错误: 行 {exc.lineno}: {exc.msg}") return 1 return 0 if __name__ == "__main__": sys.exit(main())