فشردهسازی دادهها در WebSocket به کاهش مصرف پهنای باند و افزایش سرعت انتقال پیامها کمک میکند. یکی از روشهای رایج برای فشردهسازی استفاده از الگوریتم Gzip است که برای پیامهای متنی و بزرگ بسیار مناسب است. با Gzip، دادهها قبل از ارسال فشرده میشوند و در سمت دریافت، باز میشوند.
مزایای استفاده از Gzip
- کاهش مصرف پهنای باند شبکه
- افزایش سرعت ارسال و دریافت دادهها
- سازگاری بالا با اکثر زبانها و کتابخانههای WebSocket
- قابلیت استفاده برای دادههای متنی و JSON بزرگ
نکات مهم
- سرور و کلاینت باید هر دو از Gzip پشتیبانی کنند و فرآیند فشردهسازی و باز کردن فشردهسازی هماهنگ باشد.
- برای دادههای کوچک، فشردهسازی ممکن است سود زیادی نداشته باشد و حتی سربار ایجاد کند.
- در برنامههای Real-Time با حجم داده زیاد مانند چتهای گروهی، داشبوردهای لحظهای و بازیهای آنلاین، استفاده از Gzip توصیه میشود.
نمونه کد سرور FastAPI با Gzip
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
import gzip
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
# دریافت پیام فشرده از کلاینت
compressed_data = await websocket.receive_bytes()
data = gzip.decompress(compressed_data).decode("utf-8")
print(f"Received: {data}")
# آمادهسازی پاسخ و فشردهسازی
response_message = f"Server received: {data}"
compressed_response = gzip.compress(response_message.encode("utf-8"))
await websocket.send_bytes(compressed_response)
except WebSocketDisconnect:
print("Client disconnected")
نمونه کلاینت پایتون با Gzip
import asyncio
import websockets
import gzip
async def websocket_client():
uri = "ws://127.0.0.1:8000/ws"
async with websockets.connect(uri) as websocket:
while True:
message = input("Enter your message: ")
# فشردهسازی پیام قبل از ارسال
compressed_message = gzip.compress(message.encode("utf-8"))
await websocket.send(compressed_message)
# دریافت پاسخ فشرده و باز کردن فشردهسازی
compressed_response = await websocket.recv()
response = gzip.decompress(compressed_response).decode("utf-8")
print(f"Server response: {response}")
asyncio.run(websocket_client())