diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java index ba650286..35a16fbb 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java @@ -288,15 +288,31 @@ public class RtkClusterService implements ApplicationRunner { private void dequeueLoop() { byte[] pending = null; + boolean lastWaitLogged = false; while (true) { try { + Socket out = outConn; Socket sink = inConn; - if (sink == null || sink.isClosed() || sink == outConn) { - // wait for a valid IN sink before consuming queue - ensureInCandidate(); - Thread.sleep(20); + if (out == null) { + // wait until OUT连接已就绪(rtkrcv 已输出首包/特征头) + if (!lastWaitLogged) { + LOGGER.info("Endpoint {} waiting for OUT to be ready before sending RTCM", port); + lastWaitLogged = true; + } + Thread.sleep(50); continue; } + if (sink == null || sink.isClosed() || sink == out) { + // 等待有效的 IN 连接(且不能与 OUT 相同) + if (!lastWaitLogged) { + LOGGER.info("Endpoint {} waiting for IN to be ready before sending RTCM", port); + lastWaitLogged = true; + } + ensureInCandidate(); + Thread.sleep(50); + continue; + } + lastWaitLogged = false; if (pending == null) { pending = rtcmQueue.pollFirst(100, TimeUnit.MILLISECONDS); if (pending == null) continue;