Serialize و deserialize داده‌ها در WebSocket

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/06/25
  • تعداد بازدید: 2

در 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 استفاده کرد.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.