mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 21:50:44 +00:00
115 lines
4.8 KiB
Python
115 lines
4.8 KiB
Python
# -*- 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())
|