NETWORK PROGRAMMING / MULTI-CLIENT
Một máy chủ.
Kết nối cả nhóm.
Một laptop chạy FastAPI và các bot. Các laptop còn lại chỉ cần trình duyệt, cùng Wi-Fi và địa chỉ LAN của máy chủ; không cần cài compiler hay Docker trên máy người chơi.
01 / Khởi động máy chủ Windows
Với Docker Desktop (Linux containers), chạy theo hướng dẫn Phase 2 trong README:
py -3 scripts/configure_sandbox.py docker compose up --build -d --wait
Hoặc dùng chế độ legacy cho code tin cậy, không cần Docker:
Cài Python, JDK và G++ theo README trong source. Trong thư mục LTM chạy:
start.bat # Hoặc khi môi trường đã cài: .\.venv\Scripts\python.exe run.py --host 0.0.0.0 --port 8000
0.0.0.0 là địa chỉ lắng nghe trên mọi card mạng, không phải URL để nhập vào trình duyệt. Giữ cửa sổ server mở. Một process, một worker để toàn bộ spectator dùng chung trạng thái trận.
02 / Tìm IPv4 và truy cập từ laptop thứ hai
ipconfig Get-NetConnectionProfile
Lấy IPv4 Address của card Wireless LAN adapter Wi-Fi, ví dụ 192.168.2.16. Không chọn địa chỉ adapter VPN/WSL/VirtualBox. Laptop B mở http://IP-MAY-CHU:8000. Cả hai máy nên mở bằng cùng URL LAN để link chia sẻ và cookie phiên ổn định.
Không dùng localhost trên laptop B: đó là địa chỉ của chính laptop B. IP có thể thay đổi sau khi kết nối Wi-Fi lại; chạy ipconfig để xem IP mới. Muốn ổn định, dùng DHCP reservation trên router theo MAC của card Wi-Fi; không tự chọn một IP trùng thiết bị khác.
03 / Demo ba laptop
Account-Only: đăng nhập bằng tài khoản Admin/Player; mã Organizer và cookie legacy không cấp quyền. Team submission và Captain Active Bot đã có trong Account-Only Phase 4.2C; Official Match vẫn chưa mở cho đến Phase 4.2D. Quy trình dưới đây chỉ áp dụng khi ARENA_ACCOUNT_ONLY=0.
- Laptop 1 chạy server legacy. Đặt
ARENA_ADMIN_CODEtrong PowerShell trướcstart.bat; mở quyền Organizer, chọn Robot Battle/OTT v2, lưu luật rồi LOCK GAME / OPEN COMPETITION. - Laptop 2/3 mở URL LAN, đặt nickname Hoang/Minh, upload bot Python/C++/Java theo game hiện tại. Trong MY SUBMISSIONS, mỗi người nhấn SET AS ACTIVE BOT; giữ website mở để READY.
- Organizer mở Phòng thi đấu, thấy Player online và bot/ngôn ngữ. Chọn hai người READY, nhấn INVITE TO MATCH. Organizer không nộp bot hoặc tự tham gia.
- Hai Player nhận popup cùng lời mời, mỗi người chọn Accept/Decline. Một Accept chưa chạy trận; hai Accept tự tạo đúng một trận và cả ba tự mở cùng LIVE ARENA.
- Ba trình duyệt nhận cùng sequence/result. Pause/Reset/tua độc lập; bot vẫn chạy trên server. Hoang / C++ VS Minh / Python được lưu vào history/replay, kể cả sau khi đổi nickname.
- Hết trận, Player về READY nếu còn online. Mất mạng/reconnect không hủy trận đang chạy. Reconnect lời mời không tự Accept. Decline/hết hạn 60 giây/Organizer Cancel/Close kết thúc lời mời chưa chạy.
Cookie giữ 30 ngày, không dùng nickname làm định danh. Tên trùng được phân biệt bằng ID ngắn. Presence dựa trên WebSocket/heartbeat 10 giây, timeout 35 giây. Restart giữ Active Bot/identity/history, hủy lời mời cũ đang chờ và thu hồi quyền Organizer.
Close chặn lời mời/trận mới, chờ trận và bot cleanup trước khi đổi game/luật. Replay dùng snapshot/game của chính trận, không bị đổi theo cuộc thi. Chỉ chạy bot tin cậy trong LAN.
04 / Firewall và lỗi kết nối
Chỉ dùng Wi-Fi riêng đáng tin cậy. Trong Windows Settings → Network & Internet → Wi-Fi → mạng hiện tại, chọn profile Private nếu đúng là mạng của nhóm. Khi Windows hỏi quyền cho Python, cho phép trên Private networks. Không cần tắt toàn bộ firewall.
Nếu vẫn bị chặn, trên máy chủ mở PowerShell với quyền Administrator và thêm đúng rule TCP cổng đang dùng, chỉ cho mạng riêng và subnet LAN:
New-NetFirewallRule -DisplayName "NEON ARENA LAN 8000" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8000 -Profile Private -RemoteAddress LocalSubnet # Xem rule: Get-NetFirewallRule -DisplayName "NEON ARENA LAN 8000" # Gỡ rule khi không còn demo: Remove-NetFirewallRule -DisplayName "NEON ARENA LAN 8000"
Trên laptop B kiểm tra:
Test-NetConnection IP-MAY-CHU -Port 8000 Invoke-RestMethod http://IP-MAY-CHU:8000/api/health
TcpTestSucceeded=False: kiểm tra server, IPv4, port, firewall và hai máy cùng subnet. Guest Wi-Fi hoặc AP/client isolation có thể chặn hai client dù cùng SSID.- Trang vào được nhưng bot không chạy: compiler chỉ cần trên máy chủ; xem Compiler log và /api/health.
- Live mất kết nối: giữ server hoạt động; browser tự reconnect theo sequence còn thiếu. Nếu dùng proxy, phải chuyển tiếp WebSocket Upgrade.
05 / HTTPS, WSS và reverse proxy sau này
Frontend gọi REST bằng đường dẫn tương đối; WebSocket dùng host của website và tự chuyển ws thành wss khi trang dùng HTTPS. Mẫu Nginx và cấu hình nằm trong docs/NETWORKING.md và deploy/nginx.conf.example.
Khi dùng domain/VPS, cấu hình ARENA_READ_ONLY=1 và ARENA_ALLOWED_HOSTS=arena.example.com. Chạy backend trên loopback phía sau proxy tin cậy. Chế độ này vẫn cho xem live/replay, nhưng server chặn upload, chạy trận và chỉnh luật. Demo LAN không cần proxy hay TLS.
Chỉ chạy code bot do nhóm tin cậy viết. Subprocess không phải sandbox. Không port-forward router hay công khai tính năng thực thi code lên Internet khi chưa có sandbox an toàn.