طراحی و پیادهسازی سیستم چت آنلاین با پایتون و WebSocket
تا به حال فکر کردهاید که اپلیکیشنهای چت، اعلانهای زنده در شبکههای اجتماعی یا ابزارهای ویرایش سند گروهی چگونه به صورت لحظهای کار میکنند؟ جادوی پشت این سیستمهای بلادرنگ، یک فناوری قدرتمند به نام WebSocket است. برخلاف پروتکل HTTP سنتی که در آن مرورگر باید مدام از سرور بپرسد «خبر جدیدی هست؟»، WebSocket یک کانال ارتباطی دو طرفه و همیشه باز بین کاربر و سرور ایجاد میکند. این مانند یک خط تلفن اختصاصی است که به محض برقراری تماس، هر دو طرف میتوانند هر لحظه که بخواهند با هم صحبت کنند. زبان برنامهنویسی پایتون، با قابلیتهای برنامهنویسی غیرهمزمان (Asynchronous) و کتابخانههای فوقالعادهاش، به یک انتخاب ایدهآل برای ساخت سرورهای WebSocket قدرتمند تبدیل شده است. این مقاله، نقشه راه شما برای ساخت اولین سیستم چت آنلاین خود با پایتون است.
// HTTP در مقابل WebSocket: تفاوت در چیست؟
در مدل سنتی وب (HTTP)، ارتباط بر اساس درخواست و پاسخ است. مرورگر شما یک درخواست (Request) برای دیدن یک صفحه میفرستد و سرور با ارسال اطلاعات آن صفحه، پاسخ (Response) میدهد و سپس ارتباط قطع میشود. برای ساخت چت با این روش، مرورگر مجبور است هر چند ثانیه یکبار یک درخواست جدید به سرور بفرستد تا ببیند آیا پیام جدیدی وجود دارد یا خیر (که به آن Polling میگویند). این روش بسیار ناکارآمد و مصرفکننده منابع است.
WebSocket این بازی را کاملاً تغییر میدهد. پس از یک «دستدهی» اولیه، یک تونل ارتباطی پایدار بین کاربر و سرور باز میماند. حالا سرور میتواند هر زمان که رویداد جدیدی (مانند دریافت یک پیام جدید از کاربری دیگر) رخ داد، اطلاعات را مستقیماً و بدون هیچ درخواستی به سمت مرورگر کاربر ارسال کند. این یعنی ارتباطی سریعتر، بهینهتر و کاملاً دوطرفه.
// جعبه ابزار پایتون برای ساخت سرور WebSocket
برای پیادهسازی سرور، ما از کتابخانه محبوب و قدرتمند websockets
در پایتون استفاده خواهیم کرد. این کتابخانه بر پایه ماژول استاندارد asyncio
ساخته شده که به پایتون اجازه میدهد تا هزاران اتصال همزمان را به صورت بهینه مدیریت کند.
برنامهنویسی غیرهمزمان (Asyncio) چیست؟
در برنامهنویسی سنتی، کد خط به خط اجرا میشود و اگر یک خط منتظر یک عملیات ورودی/خروجی (مانند دریافت پیام از شبکه) باشد، کل برنامه متوقف میشود. در مدل asyncio
، برنامه میتواند زمانی که منتظر یک عملیات است، به کارهای دیگر رسیدگی کند. این ویژگی برای یک سرور چت که باید به صورت همزمان به پیامهای کاربران زیادی گوش دهد، حیاتی است.
// مثال عملی: ساخت یک سرور چت ساده
بیایید یک سرور چت بسیار ساده بسازیم. این سرور هر پیامی که از یک کاربر دریافت کند را برای تمام کاربران دیگر ارسال (Broadcast) میکند.
کد سمت سرور (Python)
import asyncio
import websockets
CONNECTED_CLIENTS = set()
async def handler(websocket, path):
CONNECTED_CLIENTS.add(websocket)
try:
async for message in websocket:
websockets.broadcast(CONNECTED_CLIENTS, message)
finally:
CONNECTED_CLIENTS.remove(websocket)
async def main():
async with websockets.serve(handler, “localhost”, 8765):
await asyncio.Future() # Run forever
if __name__ == “__main__”:
asyncio.run(main())
کد سمت کاربر (HTML & JavaScript)
یک فایل HTML ساده برای برقراری ارتباط با این سرور و نمایش پیامها نیاز داریم.
آینده اپلیکیشنهای تحت وب را بسازید!
یادگیری WebSocket و برنامهنویسی غیرهمزمان در پایتون، شما را از یک توسعهدهنده وب معمولی به یک معمار سیستمهای بلادرنگ و مدرن تبدیل میکند. این مهارتها تقاضای بسیار بالایی در بازار کار امروز دارند.
- ✅ دورههای پیشرفته پایتون با تمرکز بر برنامهنویسی شبکه
- ✅ انجام پروژههای عملی Full-Stack با تکنولوژیهای مدرن
- ✅ دریافت مدرک معتبر بینالمللی فنی و حرفهای
ثبتنام در دورههای پیشرفته پایتون