Files
ykxmz/_build/fix_discovery_order.py
T
xmz7891 878b7311e9 1.6.1:常规发布
- 版本号 1.6.1 -> 1.6.1
- 重建三端并打包
- 关键测试全过
2026-10-06 20:38:33 +08:00

115 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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())