کتابخانه socket.io در پایتون
socket.io یک پروتکل و پیادهسازی محبوب برای ارتباط بلادرنگ (real-time) بین کلاینت و سرور است. در اکوسیستم پایتون، پیادهسازی معروف آن با نام python-socketio ارائه شده است که هم بهعنوان سرور و هم کلاینت قابل استفاده است. این مقاله به زبان فارسی توضیح میدهد که python-socketio چیست، چگونه کار میکند، نمونههای عملی، نکات بهینهسازی و مقایسهی رویکردها.
چرا از socket.io استفاده کنیم؟
- ارتباط دوطرفه بلادرنگ با fallback های خودکار (WebSocket، polling)
- سیستم رویدادمحور ساده (emit/on)
- پشتیبانی از namespace و room برای سازماندهی کانالها
- قابلیت مقیاسپذیری با backendهایی مثل Redis
معماری و مفاهیم کلیدی
- Events: ارسال و دریافت پیامها با نامهای مشخص (مثلاً “message”)
- Namespaces: جداسازی کانالهای منطقی (مثل /chat و /news)
- Rooms: گروهبندی ارتباطات برای ارسال هدفمند
- Transport: WebSocket یا HTTP long-polling
- Manager: برای مقیاسپذیری و هماهنگسازی بین چند سرور (مثلاً Redis)
نصب و شروع سریع
نصب پایهای python-socketio با pip انجام میشود. برای سرورهای ASGI یا aiohttp، ماژولهای مکمل نیز هست:
pip install "python-socketio[client]" "python-socketio[asyncio_server]"
# برای FastAPI و Uvicorn:
pip install fastapi uvicorn python-socketio
کد بالا پکیجهای لازم را نصب میکند. نسخههای مختلف بسته ممکن است گزینههای اضافی برای eventlet یا gevent داشته باشند.
مثال: سرور ساده با FastAPI و python-socketio (ASGI)
import socketio
from fastapi import FastAPI
import uvicorn
sio = socketio.AsyncServer(async_mode='asgi', cors_allowed_origins='*')
app = FastAPI()
sio_app = socketio.ASGIApp(sio, other_asgi_app=app)
@app.get("/")
async def index():
return {"message": "Hello from FastAPI + Socket.IO"}
@sio.event
async def connect(sid, environ):
print("Client connected:", sid)
await sio.emit("welcome", {"msg": "Welcome!"}, to=sid)
@sio.event
async def disconnect(sid):
print("Client disconnected:", sid)
@sio.event
async def chat_message(sid, data):
# Broadcase to all
await sio.emit("chat_message", data)
if __name__ == "__main__":
uvicorn.run(sio_app, host="0.0.0.0", port=8000)
در این مثال یک سرور ASGI با FastAPI ساخته شده است. شی AsyncServer از python-socketio مدیریت ارتباطات WebSocket/Socket.IO را بر عهده دارد. با تعریف decoratorهای @sio.event میتوان رویدادهایی مثل connect، disconnect و chat_message را هندل کرد. متد emit پیامها را ارسال میکند.
مثال: کلاینت پایتون
import socketio
sio = socketio.Client()
@sio.event
def connect():
print("connected to server")
sio.emit("chat_message", {"text": "سلام از کلاینت پایتون"})
@sio.event
def welcome(data):
print("Server says:", data)
@sio.event
def disconnect():
print("disconnected")
sio.connect("http://localhost:8000")
sio.wait()
این کلاینت اتصال را برقرار کرده و پس از اتصال یک پیام chat_message ارسال میکند. متد wait باعث میشود برنامه باز بماند تا پیامهای ورودی دریافت شوند.
استفاده از Rooms و Namespaces
rooms برای گروهبندی سوکتها و ارسال هدفمند کاربردی هستند. نمونه:
@sio.event
async def join_room(sid, room):
sio.enter_room(sid, room)
await sio.emit("system", {"msg": f"{sid} joined {room}"}, room=room)
@sio.event
async def leave_room(sid, room):
sio.leave_room(sid, room)
await sio.emit("system", {"msg": f"{sid} left {room}"}, room=room)
در این کد enter_room و leave_room سوکت را به روم اضافه یا حذف میکنند و emit با پارامتر room پیام را فقط به اعضای آن روم میفرستد.
مقیاسپذیری: یکپارچهسازی با Redis
وقتی چند نمونه سرور دارید، باید رویدادها بین آنها همگامسازی شوند. python-socketio از Redis بهعنوان Manager پشتیبانی میکند:
import socketio
from socketio import AsyncRedisManager
mgr = AsyncRedisManager("redis://localhost:6379/0")
sio = socketio.AsyncServer(client_manager=mgr, async_mode='asgi', cors_allowed_origins='*')
با استفاده از AsyncRedisManager پیامها و اطلاعات اتصالات بین چند سرور پخش میشوند و ویژگیهایی مثل broadcast و room در تمام نمونهها کار میکند.
تنظیمات امنیت و عملکرد
- فعالسازی CORS و کنترل origin برای جلوگیری از سوءاستفاده
- محدودیت نرخ (rate limiting) برای جلوگیری از حملات پیام تند
- استفاده از TLS/HTTPS در تولید
- تنظیمات pingInterval و pingTimeout برای تشخیص اتصالات مرده
- استفاده از gzip و compression برای دادههای بزرگ یا باینری
مقایسهٔ گزینههای اجرا (sync vs async)
| روش | مزایا | معایب |
|---|---|---|
| AsyncIO (uvicorn, FastAPI) | مقیاسپذیر، ادغام آسان با ekosystem async | نیاز به آشنایی با async/await |
| eventlet/gevent (sync) | ساده برای کدهای همزمان قدیمی | ممکن است با برخی کتابخانهها ناسازگار باشد |
بهترین شیوهها و نکات پیشرفته
- برای بار بالا از Redis یا دیگر Message Brokerها استفاده کنید.
- رویدادهای سنگین را آسنکرون کنید و از work queues (مثل Celery) برای پردازشهای طولانی بهره ببرید.
- در تولید از health checks و متریکها (مثل Prometheus) استفاده کنید تا اتصالات و نرخ پیام را مانیتور کنید.
- سازماندهی رویدادها با namespace و room باعث سادهتر شدن منطق اپلیکیشن میشود.
- برای اپلیکیشنهای موبایل و مرورگر مطمئن شوید نسخهی client (JS یا native) با نسخهی پروتکل سرور سازگار است.
آزمون و عیبیابی
برای تست میتوانید از ابزارهای زیر استفاده کنید:
- کلاینتهای رسمی python-socketio و socket.io-client-js
- WireShark یا ابزارهای لاگ برای بررسی handshake و transport
- لاگگیری سطحبالا در سرور برای مشاهده رویدادها و زمانبندی
جمعبندی
python-socketio کتابخانهای قدرتمند و منعطف برای ساخت اپلیکیشنهای بلادرنگ در پایتون است. با پشتیبانی از AsyncIO، eventlet/gevent، و مدیریت از طریق Redis، برای بسیاری از نیازهای real-time مناسب است. انتخاب بین async و sync و طراحی صحیح برای scaling و امنیت نکاتی کلیدی هستند که باید از ابتدای توسعه در نظر گرفته شوند.
اگر میخواهید نمونهٔ خاصی (مثلاً چت، بازی آنلاین یا داشبورد real-time) را پیادهسازی کنید، میتوانم یک نمونهٔ کاملتر و گامبهگام آماده کنم.
آیا این مطلب برای شما مفید بود ؟




