اپلیکیشنهای مدرن امروزی برای انواع حالتهای ارتباطگیری نیازهای مختلفی دارند. تکنولوژیهای متنوعی نیز در این حوزهها ظهور پیدا کرده که هر کدام از اهمیت بالایی برخوردار هستند. WebSocket یکی از این روشهای ارتباطگیری است.
WebSocket به کاربران اجازه میدهد تا بتوانند پیامهایی را بین خودشان و سرور رد و بدل کنند. از این رو وبسوکت یک راهکار برای ارتباط برقرار کردن میان کلاینت و سرور است. ابتدای کار بیایید برای اینکه مقاله را به سادهترین شکل ممکن پیش ببریم، منظورمان را به صورت دقیق از واژه ارتباط برقرار کردن بیان کنیم، بعد از آن به بحث وبسوکت برخواهیم گشت.
مرورگر شما که ما آن را به عنوان کلاینت میشناسیم، با سرور، از طریق پروتکل TCP/IP ارتباط برقرار میکند. در این فرایند HTTP یا Hypertext Transfer Protocol که یک پروتکل اپلیکیشن استاندارد بوده جزوی از TCP/IP به حساب میآید، مدیریت درخواست و جواب را در اختیار میگیرد. اما این اتفاقات چگونه میافتند؟
۱- ابتدای کار مرورگر یا کلاینت یک درخواست را به سرور ارسال میکند.
۲- سپس یک ارتباط ایجاد خواهد شد.
۳- بعد از آن سرور جوابی ارسال میکند.
۴- حال کلاینت جواب سرور را دریافت کرده و در نهایت...
۵- ارتباط بسته میشود.
این سادهترین شکلی بود که میتوان برای شیوه ارتباط برقرار کردن میان کلاینت و سرور در نظر گرفت.
مرحله پنجم که مرحله نهایی این ارتباط است زمانی اتفاق میافتد که درخواستهای مربوط به HTTP دیگر مورد نیاز نبوده و در نهایت ارتباط بسته میشود.
حتی در چنین صورتی هم یک ارتباط باید صورت بگیرد. البته این ارتباط باز هم از طرف کلاینت شروع میشود. در این حالت کلاینت یک درخواست را برای ایجاد ارتباط فرستاده و منتظر پیغام جدید میشود.
برای درک این موضوع به مثال زیر توجه کنید:
کلاینت غذایی را سفارش داده و منتظر است که آن غذا برایش آماده و ارسال شود. در این پروسه کلاینت هر یک ثانیه، یک بار، برای بررسی آماده شدن غذا، پیغامی ارسال میکند:
کلاینت - ثانیه صفر: غذا آماده است؟
سرور - ثانیه صفر: نه، منتظر بمانید.
کلاینت - ثانیه اول: غذا آماده است؟
سرور - ثانیه اول: نه، منتظر بمانید.
کلاینت - ثانیه دوم: غذا آماده است؟
سرور - ثانیه دوم: نه، منتظر بمانید.
کلاینت - ثانیه سوم: غذا آماده است؟
سرور - ثانیه سوم: بله، سفارش شما آماده است.
به این حالت HTTP Polling گفته میشود و همانطور که مشاهده میکنید روشی چندان بهینه و مناسب برای کار ما نیست چرا که منابع بسیار زیادی را صرف کرده و تعداد درخواستهای شکست خورده بسیار زیادی دارد.
راهی برای حل این مشکل وجود دارد؟
تکنیکهای polling مختلفی وجود دارد که به شما در حل این مشکل میتواند کمک کند. یکی از این روشها Long-Polling نام دارد.
در روش Long-Polling بعد از ایجاد یک درخواست HTTP، ارتباط را تا زمانی که سرور پاسخگو باشد نگه میدارند. این زمان توسط سرور تعیین میشود. اگر بخواهیم این تکنیک را روی مثال قبلی اعمال کنیم خروجی به صورت زیر خواهد بود:
کلاینت - ثانیه صفر: غذا آماده است؟
سرور - ثانیه سوم: بله، سفارش شما آماده است.
مشکل حل شد؟ از نظر تکنیکی بله، اما این راهکار نیز مشکلات خود را دارد. برای مثال تکنیک Long-Polling استفاده بسیار زیادی از پردازنده، حافظه و پهنای باند کرده و به همین دلیل باز هم روش بهینهای نیست. دلیل این مصرف زیاد نیز نگهداشتن منابع برای ارتباطی است که هنوز بسته نشده است. اما با وجود این تکنیک، آیا راهکار دیگهای باقی میماند؟ پاسخ: WebSocket.
همانطور که مشاهده کردید Polling و Long-Polling هر دو گزینههای بسیار سنگینی برای شبیهسازی ارتباطات بلادرنگ میان کلاینت و سرور هستند. به همین دلیل است که قصد استفاده از وبسوکت را داریم. در معماری وبسوکت شما نیازی به ارسال درخواست برای دریافت جواب ندارید. در این راهکار جریان داده به صورت دوطرفه اعمال میشود.
در این روش شما منتظر پیام سرور خواهید ماند، در نهایت سرور اگر پیامی داشته باشد برای شما ارسال میکند.
این موضوع نشان از بهینه بودن وبسوکت برای مسئله کاراییست.
مراحلی که در ایجاد یک وب سوکت دخیل هستند را میتوانید در ادامه مشاهده بکنید:
۱- کلاینت یا مرورگر یک درخواست HTTP را به سرور ارسال میکند.
۲- ارتباط با استفاده از پروتکل HTTP ایجاد میشود.
۳- اگر سرور از پروتکل وبسوکت پشتیبانی کند، با ارتقای حالت ارتباط موافقت میکند. این حالت handshake نامیده میشود.
۴- حال که handshake اتفاق افتاد، ارتباط اولیه HTTP با یک ارتباط وبسوکت جایگزین میشود. البته این موضوع را در نظر داشته باشید که پروتکل اصلی در هر حالت TCP/IP است.
۵- بعد از این اتفاق، دادهها به سادگی میتوانند بین کلاینت و سرور ارسال شوند.
درپایان WebSocket یک پروتکل ارتباطی است که در اینترنت برای ارتباط دو طرفه بین یک مرورگر وب و یک سرور در زمان واقعی استفاده میشود. این پروتکل به عنوان بخشی از HTML5 معرفی شد و اجازه میدهد تا دادهها بدون نیاز به بارگذاری مجدد صفحه وب، بین کاربر و سرور رد و بدل شوند.