# 📡 راهنمای استفاده از WebSocket API ## 🎯 مقدمه این سیستم از WebSocket برای ارتباط بلادرنگ (Real-time) بین سرور و کلاینت استفاده می‌کند که سرعت و کارایی بسیار بالاتری نسبت به HTTP polling دارد. ## 🚀 مزایای WebSocket نسبت به HTTP | ویژگی | HTTP Polling | WebSocket | |-------|--------------|-----------| | سرعت | کند (1-5 ثانیه تاخیر) | فوری (< 100ms) | | منابع سرور | بالا | پایین | | پهنای باند | زیاد | کم | | اتصال | Multiple | Single (دائمی) | | Overhead | بالا (headers هر بار) | خیلی کم | ## 📦 فایل‌های اضافه شده ### Backend: - `backend/services/connection_manager.py` - مدیریت اتصالات WebSocket - تغییرات در `api_server_extended.py` - اضافه شدن endpoint‌های WebSocket ### Frontend: - `static/js/websocket-client.js` - کلاینت JavaScript - `static/css/connection-status.css` - استایل‌های بصری - `test_websocket.html` - صفحه تست ## 🔌 اتصال به WebSocket ### از JavaScript: ```javascript // استفاده از کلاینت آماده const wsClient = new CryptoWebSocketClient(); // یا اتصال دستی const ws = new WebSocket('ws://localhost:8000/ws'); ws.onopen = () => { console.log('متصل شد!'); }; ws.onmessage = (event) => { const data = JSON.parse(event.data); console.log('پیام دریافت شد:', data); }; ``` ### از Python: ```python import asyncio import websockets import json async def connect(): uri = "ws://localhost:8000/ws" async with websockets.connect(uri) as websocket: # دریافت پیام welcome welcome = await websocket.recv() print(f"دریافت: {welcome}") # ارسال پیام await websocket.send(json.dumps({ "type": "subscribe", "group": "market" })) # دریافت پیام‌ها async for message in websocket: data = json.loads(message) print(f"داده جدید: {data}") asyncio.run(connect()) ``` ## 📨 انواع پیام‌ها ### 1. پیام‌های سیستمی (Server → Client) #### Welcome Message ```json { "type": "welcome", "session_id": "550e8400-e29b-41d4-a716-446655440000", "message": "به سیستم مانیتورینگ کریپتو خوش آمدید", "timestamp": "2024-01-15T10:30:00" } ``` #### Stats Update (هر 30 ثانیه) ```json { "type": "stats_update", "data": { "active_connections": 15, "total_sessions": 23, "messages_sent": 1250, "messages_received": 450, "client_types": { "browser": 12, "api": 2, "mobile": 1 }, "subscriptions": { "market": 8, "prices": 10, "all": 15 } }, "timestamp": "2024-01-15T10:30:30" } ``` #### Provider Stats ```json { "type": "provider_stats", "data": { "summary": { "total_providers": 150, "online": 142, "offline": 8, "overall_success_rate": 95.5 } }, "timestamp": "2024-01-15T10:30:30" } ``` #### Market Update ```json { "type": "market_update", "data": { "btc": { "price": 43250, "change_24h": 2.5 }, "eth": { "price": 2280, "change_24h": -1.2 } }, "timestamp": "2024-01-15T10:30:45" } ``` #### Price Update ```json { "type": "price_update", "data": { "symbol": "BTC", "price": 43250.50, "change_24h": 2.35 }, "timestamp": "2024-01-15T10:30:50" } ``` #### Alert ```json { "type": "alert", "data": { "alert_type": "price_threshold", "message": "قیمت بیت‌کوین از ۴۵۰۰۰ دلار عبور کرد", "severity": "info" }, "timestamp": "2024-01-15T10:31:00" } ``` #### Heartbeat ```json { "type": "heartbeat", "timestamp": "2024-01-15T10:31:10" } ``` ### 2. پیام‌های کلاینت (Client → Server) #### Subscribe ```json { "type": "subscribe", "group": "market" } ``` گروه‌های موجود: - `market` - به‌روزرسانی‌های بازار - `prices` - تغییرات قیمت - `news` - اخبار - `alerts` - هشدارها - `all` - همه #### Unsubscribe ```json { "type": "unsubscribe", "group": "market" } ``` #### Request Stats ```json { "type": "get_stats" } ``` #### Ping ```json { "type": "ping" } ``` ## 🎨 استفاده از کامپوننت‌های بصری ### 1. نوار وضعیت اتصال ```html
در حال اتصال...
👥 0 کاربر آنلاین
``` ### 2. اضافه کردن CSS و JS ```html ``` ### 3. استفاده از Client ```javascript // کلاینت به صورت خودکار متصل می‌شود // در دسترس از طریق window.wsClient // ثبت handler سفارشی window.wsClient.on('custom_event', (message) => { console.log('رویداد سفارشی:', message); }); // اتصال به وضعیت اتصال window.wsClient.onConnection((isConnected) => { if (isConnected) { console.log('✅ متصل شد'); } else { console.log('❌ قطع شد'); } }); // ارسال پیام window.wsClient.send({ type: 'custom_action', data: { value: 123 } }); ``` ## 🔧 API Endpoints ### GET `/api/sessions` دریافت لیست session‌های فعال **Response:** ```json { "sessions": { "550e8400-...": { "session_id": "550e8400-...", "client_type": "browser", "connected_at": "2024-01-15T10:00:00", "last_activity": "2024-01-15T10:30:00" } }, "stats": { "active_connections": 15, "total_sessions": 23 } } ``` ### GET `/api/sessions/stats` دریافت آمار اتصالات **Response:** ```json { "active_connections": 15, "total_sessions": 23, "messages_sent": 1250, "messages_received": 450, "client_types": { "browser": 12, "api": 2 } } ``` ### POST `/api/broadcast` ارسال پیام به همه کلاینت‌ها **Request:** ```json { "message": { "type": "notification", "text": "سیستم به‌روز شد" }, "group": "all" } ``` ## 🧪 تست ### 1. باز کردن صفحه تست: ``` http://localhost:8000/test_websocket.html ``` ### 2. چک کردن اتصال: - نوار بالای صفحه باید سبز شود (متصل) - تعداد کاربران آنلاین باید نمایش داده شود ### 3. تست دستورات: - کلیک روی دکمه‌های مختلف - مشاهده لاگ پیام‌ها در پنل پایین ### 4. تست چند تب: - باز کردن چند تب مرورگر - تعداد کاربران آنلاین باید افزایش یابد ## 📊 مانیتورینگ ### لاگ‌های سرور: ```bash # مشاهده لاگ‌های WebSocket tail -f logs/app.log | grep "WebSocket" ``` ### متریک‌ها: - تعداد اتصالات فعال - تعداد کل session‌ها - پیام‌های ارسالی/دریافتی - توزیع انواع کلاینت ## 🔒 امنیت ### توصیه‌ها: 1. برای production از `wss://` (WebSocket Secure) استفاده کنید 2. محدودیت تعداد اتصال برای هر IP 3. Rate limiting برای پیام‌ها 4. اعتبارسنجی token برای authentication ### مثال با Token: ```javascript const ws = new WebSocket('ws://localhost:8000/ws'); ws.onopen = () => { ws.send(JSON.stringify({ type: 'auth', token: 'YOUR_JWT_TOKEN' })); }; ``` ## 🐛 عیب‌یابی ### مشکل: اتصال برقرار نمی‌شود ```bash # چک کردن اجرای سرور curl http://localhost:8000/health # بررسی پورت netstat -an | grep 8000 ``` ### مشکل: اتصال قطع می‌شود - Heartbeat فعال است؟ - Proxy یا Firewall مشکل ندارد؟ - Log‌های سرور را بررسی کنید ### مشکل: پیام‌ها دریافت نمی‌شوند - Subscribe کرده‌اید؟ - نوع پیام صحیح است؟ - کنسول مرورگر را بررسی کنید ## 📚 منابع بیشتر - [WebSocket API - MDN](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) - [FastAPI WebSockets](https://fastapi.tiangolo.com/advanced/websockets/) - [websockets Python library](https://websockets.readthedocs.io/) ## 🎓 مثال کامل Integration ```html

تعداد کاربران: 0

``` --- **نکته مهم:** این سیستم به صورت خودکار reconnect می‌کند و نیازی به مدیریت دستی ندارید!