← Trở về đấu trường

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.

Đang kiểm tra kết nố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.

  1. Laptop 1 chạy server legacy. Đặt ARENA_ADMIN_CODE trong PowerShell trước start.bat; mở quyền Organizer, chọn Robot Battle/OTT v2, lưu luật rồi LOCK GAME / OPEN COMPETITION.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

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.

TRUSTED GROUP ONLY
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.