Server (network.py): send every record in diff mode starting from
prev={}, including the first — fixes history drop on new client connect.
Collect (collect.py): remove payload["_diff"] = True from live broadcast.
GUI client (gui_client.py): always call jay_merge_full in diff mode;
drop the _diff key check that gated reconstruction.
CLI client (client.py): fix `args.diff or True` guard that made --diff
irrelevant.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
WeConnect push-server test client.
|
|
|
|
Connects to the collect.py TCP push server and prints each incoming
|
|
snapshot to stdout as pretty-printed JSON.
|
|
|
|
Usage
|
|
-----
|
|
python client.py
|
|
python client.py --host 192.168.1.10 --port 9999
|
|
python client.py --diff # reconstruct from diff stream
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import socket
|
|
import sys
|
|
|
|
from utils.jay_diff import jay_merge_full
|
|
|
|
|
|
def main() -> None:
|
|
p = argparse.ArgumentParser(
|
|
description=__doc__,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
)
|
|
p.add_argument("--host", default="127.0.0.1", help="Server host (default: 127.0.0.1)")
|
|
p.add_argument("--port", type=int, default=9999, help="Server port (default: 9999)")
|
|
p.add_argument("--diff", action="store_true", help="Reconstruct full snapshots from diff stream")
|
|
args = p.parse_args()
|
|
|
|
print(f"Connecting to {args.host}:{args.port} …", flush=True)
|
|
try:
|
|
sock = socket.create_connection((args.host, args.port))
|
|
except OSError as e:
|
|
print(f"Connection failed: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
print("Connected. Waiting for data (Ctrl-C to quit).\n", flush=True)
|
|
buf = ""
|
|
count = 0
|
|
state: dict = {}
|
|
try:
|
|
with sock:
|
|
while True:
|
|
chunk = sock.recv(4096).decode()
|
|
if not chunk:
|
|
print("Server closed the connection.")
|
|
break
|
|
buf += chunk
|
|
while "\n" in buf:
|
|
line, buf = buf.split("\n", 1)
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
try:
|
|
data = json.loads(line)
|
|
if args.diff:
|
|
state = jay_merge_full(state, data)
|
|
display = state
|
|
else:
|
|
display = data
|
|
count += 1
|
|
print(json.dumps(display, indent=2))
|
|
print(f"--- #{count} ", "-" * 50, flush=True)
|
|
except json.JSONDecodeError as e:
|
|
print(f"[invalid JSON] {e}: {line!r}", file=sys.stderr)
|
|
except KeyboardInterrupt:
|
|
print("\nStopped by user.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |