# -*- coding: utf-8 -*- """手表端:被新连接顶掉时就老实断开,不要抢回来。 配合中转的 409 + replaced=true。 区分两种情况: 401 / 403 -> 会话过期(中转重启等)-> 自动重连 409 + replaced -> 被另一台手表接管 -> 断开并提示,不再抢 """ from __future__ import annotations import sys from pathlib import Path RELAY = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\android\src" r"\com\lanremote\watch\RelayTransport.java") OLD = ''' HttpResult result = request("/v1/client/poll", new byte[0], true, POLL_TIMEOUT_MS); if (result.code == 401 || result.code == 403) { // 会话没了(中转重启 / 被踢),重新接入 online = false; lastError = "会话已失效,正在重新接入"; if (!reattach()) { sleep(backoff); backoff = Math.min(RETRY_MAX_MS, backoff * 2); continue; } backoff = RETRY_MIN_MS; continue; }''' NEW = ''' HttpResult result = request("/v1/client/poll", new byte[0], true, POLL_TIMEOUT_MS); if (result.code == 409) { // 被另一台手表接管了。这里**必须断开**,不能重连 —— // 否则两台手表会互相把对方顶掉,永远握不上手。 online = false; lastError = "已被另一台手表接管"; replaced = true; closed = true; return; } if (result.code == 401 || result.code == 403) { // 会话过期(中转重启等)—— 这种可以自动重连 online = false; lastError = "会话已失效,正在重新接入"; if (!reattach()) { sleep(backoff); backoff = Math.min(RETRY_MAX_MS, backoff * 2); continue; } backoff = RETRY_MIN_MS; continue; }''' OLD_FIELD = ''' private volatile boolean closed;''' NEW_FIELD = ''' private volatile boolean closed; /** 是否被另一台手表顶替(这种情况下不该重连) */ private volatile boolean replaced;''' OLD_GETTER = ''' public boolean isOnline() { return online && !closed; }''' NEW_GETTER = ''' public boolean isOnline() { return online && !closed; } /** 是不是被另一台手表接管了。界面据此提示"已被接管"而不是"连接失败"。 */ public boolean isReplaced() { return replaced; }''' def main() -> int: text = RELAY.read_text(encoding="utf-8") ok = True for old, new, tag in ((OLD_FIELD, NEW_FIELD, "加 replaced 字段"), (OLD_GETTER, NEW_GETTER, "加 isReplaced()"), (OLD, NEW, "409 时断开不重连")): if old not in text: print(f" [失败] {tag} —— 锚点没找到") ok = False continue text = text.replace(old, new, 1) print(f" {tag}") RELAY.write_text(text, encoding="utf-8") return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())