Really-amin's picture
Upload 301 files
e4e4574 verified
# 📡 راهنمای استفاده از 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
<!-- اضافه کردن به صفحه -->
<div class="connection-status-bar" id="ws-connection-status">
<div class="ws-connection-info">
<span class="status-dot status-dot-offline" id="ws-status-dot"></span>
<span class="ws-status-text" id="ws-status-text">در حال اتصال...</span>
</div>
<div class="online-users-widget">
<div class="online-users-count">
<span class="users-icon">👥</span>
<span class="count-number" id="active-users-count">0</span>
<span class="count-label">کاربر آنلاین</span>
</div>
</div>
</div>
```
### 2. اضافه کردن CSS و JS
```html
<head>
<link rel="stylesheet" href="/static/css/connection-status.css">
</head>
<body>
<!-- محتوا -->
<script src="/static/js/websocket-client.js"></script>
</body>
```
### 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
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<link rel="stylesheet" href="/static/css/connection-status.css">
</head>
<body>
<!-- UI Components -->
<div class="connection-status-bar" id="ws-connection-status">
<!-- ... -->
</div>
<div class="dashboard">
<h1>تعداد کاربران: <span id="user-count">0</span></h1>
</div>
<script src="/static/js/websocket-client.js"></script>
<script>
// Custom logic
if (window.wsClient) {
window.wsClient.on('stats_update', (msg) => {
document.getElementById('user-count').textContent =
msg.data.active_connections;
});
}
</script>
</body>
</html>
```
---
**نکته مهم:** این سیستم به صورت خودکار reconnect می‌کند و نیازی به مدیریت دستی ندارید!