Socket.IO چیست؟ + مزایا و ویژگی های آن (معرفی جامع)
Socket.IO یک کتابخانه جاوا اسکریپت رویداد محور برای وب اپلیکیشن های بلادرنگ (real-time) است. این پلتفرم امکان ارتباط real-time و دوطرفه بین کاربران و سرورها را فراهم می کند. این پلتفرم دارای دو بخش اصلی است: یک کتابخانه سمت کلاینت که در مرورگر اجرا می شود و یک کتابخانه سمت سرور برای Node.js که هر دو مؤلفه یک API تقریباً یکسان دارند.
Socket.IO چیست؟
Socket IO در سال 2010 ایجاد شد. برای استفاده از اتصالات باز برای تسهیل ارتباطات بلادرنگ که یک پدیده نسبتاً جدید در آن زمان بود، توسعه یافت.
همانطور که گفتیم Socket.IO امکان ارتباط دوطرفه بین کاربر و سرور را فراهم می کند. ارتباطات دوطرفه زمانی فعال می شوند که یک کلاینت Socket.IO را در مرورگر خود داشته باشد و سرور نیز پکیج Socket.IO را یکپارچه کرده باشد. با وجود اینکه در این ارتباط داده ها را می توان به چندین شکل ارسال کرد اما JSON ساده ترین شکل آن است.
برای برقراری ارتباط و تبادل داده بین مشتری و سرور، Socket IO از Engine.IO استفاده می کند که یک پیاده سازی سطح پایین تر است. در واقع Engine.IO برای اجرای سرور و Engine.IO-client برای مشتری استفاده می شود.
WebSockets نیز یک پیاده سازی مرورگر است که امکان ارتباط دو طرفه را فراهم می کند. با این حال، Socket.IO از آن به عنوان یک استاندارد استفاده نمی کند. ابتدا Socket.IO با استفاده از xhr-polling یک اتصال طولانی (long-polling) ایجاد می کند و پس از ایجاد، به بهترین روش اتصال موجود ارتقا می یابد. در بیشتر موارد، این منجر به اتصال WebSocket می شود.
ویژگی ها و مزایای Socket.IO
Socket.IO توانایی پیاده سازی تجزیه و تحلیل فوری، جریان باینری، پیام رسانی فوری و همکاری اسناد را فراهم میکند. کاربران شاخص این پلتفرم عبارتند از Microsoft Office، Yammer و Zendesk
Socket.IO اتصال را به صورت شفاف مدیریت میکند و در صورت امکان به طور خودکار به WebSocket ارتقا مییابد. این بدان معنی است که توسعه دهنده برای استفاده از Socket.IO نیازی به دانستن نحوه استفاده از پروتکل WebSocket ندارد.
یک راه محبوب برای نشان دادن ارتباط دو طرفه Socket.IO یک برنامه چت اولیه است. با سوکت آی او، زمانی که سرور یک پیام جدید دریافت میکند، آن را برای کاربر ارسال میکند و به آنها اطلاع میدهد و نیاز به ارسال درخواست ها بین کاربر و سرور را حذف میکند. یک برنامه چت ساده نشان می دهد که چگونه این پلتفرم کار میکند.
یک راه محبوب برای نشان دادن ارتباط دو طرفه Socket.IO یک برنامه چت اولیه است. با Socket IO، زمانی که سرور یک پیام جدید دریافت می کند، آن را برای مشتری ارسال می کند و به آنها اطلاع می دهد و نیاز به ارسال درخواست ها بین مشتری و سرور را از بین می برد. یک برنامه چت ساده مشابه تصویر زیر به خوبی نشان می دهد که Socket IO چگونه کار می کند.
مثال – استفاده از Socket.IO برای چت
ابتدا باید node.js را نصب کنید. ما از express برای ساده کردن راه اندازی استفاده خواهیم کرد.
سمت سرور
مرحله اول – یک پوشه جدید ایجاد کنید:
1 2 3 |
$ mkdir socket.io-example cd socket.io-example npm install socket.io express |
مرحله دوم – راه اندازی سرور و import کردن پکیج های مورد نیاز:
1 2 3 |
const app = require("express")(); const http = require("http").createServer(app); const io = require("socket.io")(http); |
ریشه سرور index.html ما را ارسال خواهد کرد که باعث نصب سریع تر می شود:
1 |
app.get("/", (req, res) => res.sendFile(__dirname + "/index.html")); |
حالا باید Socket.IO را نصب کنیم. سرور منتظر یک رویداد “اتصال” است و هر زمان که این اتفاق بیفتد عملکرد (Function) ارائه شده را اجرا می کند:
1 2 3 |
io.on("connection", function(socket) { console.log(“socket connected”); }); |
و کد زیر سرور را برای دریافت داده در پورت 3000 تنظیم می کند:
1 |
http.listen(3000, () => console.log("listening on http://localhost:3000") |
حالا برنامه را با node index.js اجرا کنید و صفحه را در مرورگر خود باز کنید.
سمت کاربر
اسکریپت های زیر را قبل از بستن تگ </body> در صفحه خود قرار دهید. حالا شما یک اتصال سوکت دارید.
1 2 3 4 |
<script src="/socket.io/socket.io.js"></script> <script> const socket = io(); </script> |
راه اندازی و استفاده از Socket.IO
شروع به کار با Socket.IO نسبتا ساده است. تنها چیزی که نیاز دارید یک سرور Node.js برای اجرای آن است. اگر میخواهید با یک برنامه real-time برای تعداد محدودی از کاربران شروع کنید، Socket.IO گزینه خوبی است. مشکلات معمولا در پروژه های بزرگ ایجاد می شوند. مثلا اگر بخواهید یک اپلیکیشن CRM را توسعه دهید که ارتباطات بین کارکنان را میسر کند. قطعا در چنین پروژه های بزرگی استفاده از Socket io منطقی نیست.
Socket.IO بر روی کتابخانه های شبکه سازی غیرهمزمان (asynchronous networking libraries) ساخته شده است و باعث افزایش بار روی سرور شما میشود. حفظ اتصالات به کاربران و همچنین ارسال و دریافت پیامها فشار زیادی را به همراه دارد و اگر کاربران و مشتریان شروع به ارسال مقادیر قابل توجهی از داده ها از طریق Socket.IO کنند، دادهها را به صورت تکهای منتقل میکند و پس از انتقال هر قطعه داده، منابع را آزاد میکند.
بنابراین هنگامی که برنامه شما کاربران بیشتری را جذب میکند و سرور شما به حداکثر بار خود میرسد، باید کانکشن های خود را بین چندین سرور تقسیم کنید، در غیر این صورت خطر از دست دادن اطلاعات مهم وجود دارد.
البته این کار به سادگی اضافه کردن یک سرور دیگر نیست. Socket.IO یک اتصال باز بین سرور و کاربر است. سرور فقط در مورد کاربرانی میداند که مستقیماً با آن ارتباط برقرار کرده اند و نه آنهایی که به سرورهای دیگر متصل هستند! با بازگشت به مثال چت، تصور کنید میخواهید پیامی را با این مضمون که فردی به چت پیوسته است را برای همه کاربران پخش کنید اگر آنها به سرور دیگری متصل باشند، این پیام را دریافت نمی کنند.
برای حل این مشکل باید یک پایگاه داده فرعی به عنوان مثال Redis داشته باشید. این پایگاه با اطلاع رسانی به تمامی سرورها مبنی بر نیاز به ارسال پیام هنگام پیوستن شخصی به چت، مشکل فوق را حل میکند اما متأسفانه، این به معنای یک پایگاه داده اضافی برای نگهداری است که به احتمال زیاد به سرور خود نیاز دارد.
Socket.IO یک آداپتور socket.io-adapter ایجاد کرده است که با pub/sub store و سرورها برای به اشتراک گذاری اطلاعات کار می کند. میتوانید برای رفع مشکل بالا از این آداپتور استفاده کنید یا میتوانید از چیزی که برای Redis ارائه کردهاند استفاده کنید که خوشبختانه Socket.IO به راحتی با آن ادغام میشود.
دیگر تقویتکنندههای قابلیت اطمینان (reliability enhancers) برای Socket.IO ممکن است شامل CoreOS باشد تا معماری را به واحدهایی تقسیم کند که میتوانند در سختافزار موجود توزیع شوند و با افزایش بار، نمونههای جدیدی را معرفی کنند.
یکی دیگر از مسائل مربوط به مقیاسپذیری Socket.IO این است که در حالی که WebSockets اتصال خود را باز نگه میدارد، اگر اتصال به مرحله نظرسنجی بازگردد، چندین درخواست در طول عمر اتصال وجود دارد. وقتی یکی از این درخواستها به سرور دیگری میرود، خطای «خطا در هنگام دست دادن WebSocket: کد پاسخ غیرمنتظره: 400» دریافت خواهید کرد. (Error during WebSocket handshake: Unexpected response code: 400)
دو راه اصلی برای حل این مشکل، مسیریابی مشتریان بر اساس آدرس مبدا یا بر اساس کوکی است. Socket.IO اسناد عالی در مورد چگونگی حل این مشکل برای محیط های مختلف دارد که می توانید از اینجا مطالعه کنید.
در حالی که Socket.IO تمایل دارد مستندات خوبی برای روش های رفع محدودیتهای خود داشته باشد اما این روش ها معمولا به عنوان یک میانبر به حساب میآیند تا یک راهحل. اگر قصد توسعه برنامه خود را دارید، این روشهای پیشنهادی در نهایت پیچیدگی و خطاها را افزایش خواهند داد.
محدودیت ها و معایب Socket.IO
مانند تمام فناوریها، انتخاب درست زمانی انجام می شود که چشم انداز روشنی از محصول خود و آینده آن داشته باشید. Socket.IO بسیاری از کارها را در مقایسه با راهاندازی دستی سوکتها آسانتر میکند، اما علاوه بر مشکل مقیاس پذیری که در بالا اشاره شد، محدودیتها و معایب دیگری نیز در آن وجود دارد.
اولین مورد این است که اتصال اولیه در مقایسه با WebSocket ها طولانیتر است. این به این دلیل است که ابتدا یک اتصال با استفاده از نظرسنجی طولانی و xhr-polling برقرار میکند و سپس در صورت نیاز به WebSockets ارتقا مییابد.
اگر نیازی به پشتیبانی از مرورگرهای قدیمی ندارید و نگران عدم پشتیبانی نرم افزارهای سمت کلاینت از WebSockets نیستید، شاید بهتر باشد که از Socket.IO با آن همه بار اضافی استفاده نکنید. البته میتوانید این بار اضافه را با تعیین اتصال مخصوص WebSockets به حداقل برسانید. با این کار اتصال اولیه شما به WebSocket تغییر میکند، اما هرگونه بازگشتی را نیز حذف میکند.
سمت کلاینت
1 |
Const socket = io({transports: [“websocket”], upgrade: false}); |
سمت سرور
1 |
io.set("transports", ["websocket"]); |
در این سناریو، کلاینت همچنان باید فایل جاوا اسکریپت socket.io 61.2 کیلوبایتی را دانلود کند. حجم این فایل 61.2 کیلوبایت می باشد. اطلاعات بیشتر در مورد این فرآیند را در اینجا می توانید مطالعه نمایید.
برای پخش جریانی که بنا به تعریف داده سنگین است، برای مثال پخش ویدیو، سوکت ها راه حل مناسبی نیستند. اگر می خواهید از تبادل داده در این سطح پشتیبانی کنید، راه حل بهتر webRTC است.
آینده Socket.IO
در تاریخ 9 مارس 2021، Socket.IO V4 منتشر شد که یک پاکسازی API با چندین ویژگی جدید مانند پشتیبانی مورد انتظار (much-awaited support) برای تایپ رویدادها، تغییرناپذیری یا Immutability است و چندین باگ در آن برطرف شده است. با نگاهی به دانلودهای NPM متوجه می شویم که استفاده از Socket.IO افزایش یافته است:
از طرف دیگر، Sockjs و WS به طور پیوسته در حال رشد بوده اند و از Socket.IO در دانلودهای NPM پیشی گرفته اند. این نشان میدهد که اگرچه استفاده از Socket io افزایش یافته است، اما توسعه دهندگان جایگزین هایی را نیز برای Socket.IO پیدا کرده اند.
همانطور که در بالا گفتیم، همه مرورگرهای مدرن اکنون از WebSockets پشتیبانی میکنند که این امر برخی از نیازها به بستهای که اتصالات سوکت را در مرورگر مدیریت میکند را نفی میکند و همچنین موجب افزایش محبوبیت بستههایی مانند WS می شود که اتصال سوکت سمت سرور را مدیریت میکنند و برای اتصالات و ارتباطات سمت کلاینت به API مرورگر بومی متکی هستند.
مقیاس پذیری برنامهها شاید سختترین مرحله در استفاده از سوکت آیو باشد و پیادهسازی Socket.IO برای اتصالات غیر WebSocket این فرآیند را پیچیدهتر میکند. پشتیبانی آینده Socket.IO نیز در هاله ای از ابهام است.
جدا از مساله پشتیبانی در آینده، استفاده یا عدم استفاده از socket.io واقعاً به هدف شما بستگی دارد. حقیقت این است که Socket.io برای ساخت برنامه های real-time ساده گزینه خوبی است. اما با گسترش پشتیبانی WebSocket پاسخ به رشد عظیم تقاضا برای برنامهها و خدمات real-time از زمان راهاندازی Socket.IO در سال 2010، حالا گزینههای بیشتری برای استفاده از پلتفرم های مشابه وجود دارد و همین عامل باعث شده تا Socket IO ارتقا جزیی داشته باشد.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.