در WebSocket، پیامها معمولاً به صورت رشتهای (String) یا بایت ارسال میشوند. برای ارسال دادههای ساختاریافته مانند JSON، دیکشنری پایتون یا شیءهای پیچیده، باید آنها را سریالسازی (serialize) کرده و در سمت دریافت، دیسریالسازی (deserialize) کرد. این کار باعث میشود پیامها به راحتی قابل پردازش و انتقال باشند.
مزایای سریالسازی و دیسریالسازی
- ارسال دادههای پیچیده و ساختاریافته به صورت امن و استاندارد
- همکاری آسان بین کلاینت و سرور با زبانها و پلتفرمهای مختلف
- قابلیت ترکیب با فشردهسازی برای کاهش حجم پیامها
- امکان بررسی و اعتبارسنجی دادهها قبل از پردازش
فرمتهای رایج
- JSON: محبوب و استاندارد برای دادههای متنی، قابل خواندن توسط انسان و زبانهای مختلف.
- MessagePack: فرمت باینری سریع و فشرده، مناسب برای دادههای بزرگ.
- Pickle: مخصوص پایتون، اما محدود به محیط پایتون و با خطرات امنیتی اگر دادهها از منابع غیرقابل اعتماد باشند.
نمونه کد سرور FastAPI با سریالسازی JSON
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
import json
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
# دیسریالسازی داده JSON
payload = json.loads(data)
print(f"Received payload: {payload}")
# پردازش داده و پاسخ
response = {"status": "ok", "message": f"Hello {payload.get('username', 'Guest')}"}
# سریالسازی داده JSON برای ارسال
await websocket.send_text(json.dumps(response))
except WebSocketDisconnect:
print("Client disconnected")
نمونه کلاینت پایتون با سریالسازی و دیسریالسازی JSON
import asyncio
import websockets
import json
async def websocket_client():
uri = "ws://127.0.0.1:8000/ws"
async with websockets.connect(uri) as websocket:
while True:
username = input("Enter your name: ")
payload = {"username": username, "message": "Hello server!"}
# سریالسازی JSON قبل از ارسال
await websocket.send(json.dumps(payload))
# دریافت پاسخ و دیسریالسازی JSON
response = await websocket.recv()
response_data = json.loads(response)
print(f"Server response: {response_data}")
asyncio.run(websocket_client())
توضیح:
- در این مثال، دادههای ارسالی به صورت JSON سریالسازی میشوند.
- سرور پیام دریافت شده را دیسریالسازی میکند و پاسخ را دوباره سریالسازی کرده و ارسال میکند.
- استفاده از JSON باعث سازگاری با کلاینتهای مختلف و زبانهای دیگر میشود.
- برای دادههای بزرگ یا باینری میتوان از فرمتهایی مانند MessagePack یا Gzip ترکیب با JSON استفاده کرد.