WebSocket — پروتکل ارتباط دوطرفه کامل است که اتصال دائمی بین کلاینت و سرور برای تبادل داده در زمان واقعی فراهم میکند. برخلاف درخواستهای سنتی HTTP، این پروتکل یک اتصال برقرار کرده و از آن برای انتقال دوطرفه بدون دستدهی مجدد استفاده میکند. به گزارش Mozilla Developer Network (2025)، WebSocket تأخیر را تا 50% در مقایسه با HTTP polling در برنامههای بیدرنگ کاهش میدهد.
نکات کلیدی
WebSocket — یک پروتکل ارتباطی است که روی TCP کار میکند و یک کانال دوطرفه کامل بین کلاینت و سرور فراهم میکند. این پروتکل توسط IETF به عنوان RFC 6455 در سال 2011 استاندارد شده و توسط تمام مرورگرهای مدرن، پلتفرمهای موبایل و فریمورکهای سرور پشتیبانی میشود.
برخلاف HTTP، که در آن کلاینت درخواست را آغاز کرده و پاسخ دریافت میکند، WebSocket به هر دو طرف اجازه میدهد پس از برقراری اتصال، در هر زمان پیام ارسال کنند. این امر آن را برای سناریوهایی که نیاز به تحویل فوری داده دارند ایدهآل میکند: چتها، اعلانها، ویرایش مشترک اسناد.
پروتکل WebSocket از پورت HTTP 80 یا پورت HTTPS 443 برای دستدهی اولیه استفاده میکند، پس از آن به پروتکل خود با هدر حداقلی — فقط 2 بایت در مقابل 800+ بایت در HTTP — سوئیچ میکند. این ویژگی در تعداد زیاد پیامها مزیت قابل توجهی در عملکرد ایجاد میکند.
اتصال WebSocket با درخواست HTTP Upgrade آغاز میشود، پس از آن پروتکل به فرمت فریم باینری سوئیچ میکند. اندازه فریم از 2 بایت تا 2^63 بایت متغیر است که امکان ارسال هم پیامهای متنی کوتاه و هم دادههای باینری بزرگ را فراهم میکند. قطعهبندی پیامها، ماسکگذاری داده از کلاینت به سرور و ping/pong برای حفظ اتصال پشتیبانی میشود.
فرآیند برقراری اتصال WebSocket از دو مرحله تشکیل شده است: دستدهی و انتقال داده. در مرحله دستدهی، کلاینت یک درخواست HTTP با هدر Upgrade: websocket ارسال میکند و سرور تغییر پروتکل را با وضعیت 101 Switching Protocols تأیید میکند. پس از آن، اتصال به حالت انتقال دوطرفه کامل میرود.
هر پیام در WebSocket به فریمها تقسیم میشود. فریم شامل opcode (متن، داده باینری، بستن، ping/pong)، طول بار و کلید ماسکگذاری برای داده از کلاینت است. فریم میتواند قطعهبندی شود — فریمهای کنترلی (ping/pong) میتوانند بین قطعات پیام ارسال شوند که از قطع اتصال در طول انتقال طولانی جلوگیری میکند.
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('اتصال برقرار شد')
ws.send('سلام سرور!')
})
ws.addEventListener('message', (event) => {
console.log('دریافت شد:', event.data)
})
ws.addEventListener('close', () => {
console.log('اتصال بسته شد')
})
در مثال بالا، کلاینت یک شی WebSocket ایجاد میکند و URL ایمن wss:// را مشخص میکند. پس از باز شدن اتصال، یک پیام خوشآمدگویی ارسال میشود و handler message پاسخهای سرور را دریافت میکند. هنگام بستن، handler close فعال میشود — این برای اتصال مجدد در هنگام قطع شبکه مهم است.
تفاوت اصلی بین WebSocket و HTTP در مدل تعامل است. HTTP بر اساس طرح درخواست-پاسخ کار میکند: کلاینت درخواست را آغاز میکند، سرور پاسخ را برمیگرداند، اتصال بسته میشود. WebSocket اما یک کانال دائمی برقرار میکند که از طریق آن هر دو طرف میتوانند در هر زمان انتقال را آغاز کنند.
برای برنامههایی که نیاز به تأخیر کم و جریان داده دائمی دارند، WebSocket به طور قابل توجهی کارآمدتر است. HTTP Long Polling — جایگزینی که در آن سرور درخواست را تا زمان ظهور داده باز نگه میدارد — بار اضافی بر سرور ایجاد میکند و مصرف حافظه را به دلیل تعداد زیادی اتصال همزمان افزایش میدهد.
| پارامتر | WebSocket | HTTP |
|---|---|---|
| مدل | دوطرفه کامل | درخواست-پاسخ |
| هدر | 2–14 بایت | 400–800 بایت |
| اتصال دائمی | بله، یک | خیر، جدید برای هر درخواست |
| تأخیر | کم (1–5 میلیثانیه) | زیاد (50–200 میلیثانیه) |
| پروتکل | ws:// یا wss:// | http:// یا https:// |
بر اساس High Performance Browser Networking (Grigorik, O’Reilly)، WebSocket تأخیر شبکه را در سناریوهای بیدرنگ 40–60% در مقایسه با HTTP Long Polling کاهش میدهد و بار سرور به دلیل حذف دستدهیهای مجدد 3–5 برابر کاهش مییابد.
به دلیل تأخیر کم و ارتباط دوطرفه، WebSocket در طیف گستردهای از برنامهها استفاده میشود. سناریوهای کلیدی شامل تبادل فوری پیام، همگامسازی وضعیت در بازیها و انتقال دادههای بازار در سیستمهای مالی است.
WebSocket به استاندارد دوفاکتو برای برنامههای چت تبدیل شده است. پلتفرمهایی مانند Slack، Telegram Web و WhatsApp Web از WebSocket برای تحویل فوری پیام استفاده میکنند. پروتکل امکان ارسال هم پیامهای متنی و هم فایلها را از طریق یک کانال واحد فراهم میکند و مکانیزم ping/pong اتصال را حتی در صورت عدم فعالیت فعال نگه میدارد.
بازیهای چندنفره مرورگری و موبایلی برای همگامسازی وضعیت بازیکنان به تأخیر حداقلی نیاز دارند. WebSocket مختصات، اقدامات و رویدادها را در زمان واقعی بدون تأخیر درخواستهای HTTP منتقل میکند. فریمورکهایی مانند Socket.IO و Colyseus کار سطح پایین با پروتکل را انتزاع کرده و اتصال مجدد خودکار و اتاقها را اضافه میکنند.
ترمینالهای بورس و پلتفرمهای معاملاتی از WebSocket برای دریافت قیمتها در زمان واقعی استفاده میکنند. تأخیر چند میلیثانیهای میتواند میلیونها دلار هزینه داشته باشد، بنابراین APIهای مالی — مانند Binance WebSocket Streams، Coinbase Pro — برای دادههای بازار دقیقاً رابطهای WebSocket را ارائه میدهند.
در توسعه موبایل، WebSocket از طریق APIهای بومی استفاده میشود: URLSessionWebSocketTask در iOS و OkHttp WebSocket در Android. برای Flutter کتابخانه web_socket_channel و برای React Native — react-native-websocket وجود دارد. دستگاههای IoT از WebSocket برای ارسال تلهمتری و دریافت دستورات کنترلی استفاده میکنند، زیرا پروتکل انرژی کمتری نسبت به HTTP-polling مداوم مصرف میکند.
بیایید نمونه بخش سرور در Node.js با کتابخانه ws — محبوبترین پیادهسازی WebSocket برای JavaScript — را بررسی کنیم. سرور اتصالات را میپذیرد، پیامها را پردازش میکند و آنها را به همه کلاینتهای متصل پخش میکند.
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('کلاینت جدید متصل شد')
ws.on('message', (data) => {
console.log('دریافت شد:', data.toString())
ws.send('سرور پیام شما را دریافت کرد')
})
ws.on('close', () => {
console.log('کلاینت قطع شد')
})
})
console.log('سرور WebSocket در پورت 8080 راهاندازی شد')
سرور یک نمونه WebSocket.Server در پورت 8080 ایجاد کرده و منتظر اتصالات میماند. به هر کلاینت جدید یک شی ws جداگانه اختصاص داده میشود که سرور از طریق آن میتواند پیامها را به صورت فردی ارسال کند. پخش پیامها به همه کلاینتها از طریق پیمایش انبوه آرایه اتصالات انجام میشود. با تعداد زیاد کلاینت (بیش از 1000) توصیه میشود از کتابخانههای پشتیبانیکننده خوشهبندی مانند Socket.IO استفاده کنید که مقیاسپذیری از طریق Redis و اتصال مجدد خودکار را اضافه میکنند.
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('پیام برای همه شرکتکنندگان')
}
})
بررسی readyState قبل از ارسال الزامی است: اگر کلاینت قبلاً قطع شده باشد، فراخوانی send خطا ایجاد میکند. پرچم WebSocket.OPEN تضمین میکند که اتصال فعال است و پیام تحویل داده خواهد شد.
برای برنامههای iOS موبایل، WebSocket از طریق URLSessionWebSocketTask که از iOS 13 در دسترس است پیادهسازی میشود. جلسه یک وظیفه با URL پروتکل wss:// ایجاد میکند، سپس متدهای send و receive فراخوانی میشوند. دریافت پیامها را میتوان از طریق بازگشت پیوسته receive سازماندهی کرد که پس از پردازش پیام قبلی منتظر پیام بعدی میماند و دریافت مداوم داده را بدون اتصال مجدد تضمین میکند. برای Android از OkHttp WebSocket استفاده میشود که رابط مشابهی با callbackهای onOpen، onMessage، onClosing و onClosed و همچنین اتصال مجدد خودکار در هنگام قطع اتصال ارائه میدهد.
هنگام کار با WebSocket در برنامههای موبایل، مدیریت چرخه عمر مهم است: وقتی برنامه به پسزمینه میرود، اتصال ممکن است توسط سیستم قطع شود. در iOS باید اتصال را هنگام بازگشت به پیشزمینه از طریق delegate sceneDidBecomeActive دوباره برقرار کرد. در Android باید از کامپوننتهای Lifecycle-aware یا Service برای حفظ اتصال استفاده کرد. علاوه بر این، توصیه میشود exponential backoff را هنگام اتصال مجدد پیادهسازی کنید — افزایش فاصله بین تلاشها از 1 تا 30 ثانیه، برای ایجاد بار اضافی روی سرور در هنگام مشکلات موقت شبکه.
سوالات متداول
WebSocket یک اتصال دائمی دوطرفه کامل برقرار میکند که از طریق آن هر دو طرف میتوانند در هر زمان داده ارسال کنند. HTTP بر اساس طرح درخواست-پاسخ کار میکند، جایی که هر تبادل نیاز به اتصال جدید و هدرهای کامل دارد. WebSocket از یک کانال TCP و هدرهای فقط 2–14 بایت استفاده میکند که تأخیر را به شدت کاهش میدهد.
WebSocket از پورت 80 برای اتصالات ناایمن (ws://) و پورت 443 برای اتصالات ایمن (wss://) استفاده میکند. این امکان عبور از اکثر سرورهای پروکسی و فایروالهای شرکتی بدون تنظیمات اضافی را فراهم میکند. پورت 443 به دلیل رمزنگاری TLS برای محیطهای تولید توصیه میشود.
بله، WebSocket در تمام پلتفرمهای موبایل پشتیبانی میشود. در iOS کلاس بومی URLSessionWebSocketTask از iOS 13 در دسترس است. در Android — کلاس OkHttp WebSocket و java.net.WebSocket استاندارد. برای React Native کتابخانه react-native-websocket وجود دارد.
WebSocket Secure — نسخه امن پروتکل است که روی TLS کار میکند. همه دادهها مانند HTTPS رمزنگاری میشوند. WSS برای برنامههای تولید اجباری است، به ویژه هنگام انتقال توکنهای احراز هویت یا دادههای شخصی از طریق WebSocket.
جایگزینهای اصلی: HTTP Long Polling (سرور درخواست را باز نگه میدارد)، Server-Sent Events (جریان یکطرفه از سرور) و WebRTC Data Channel (ارتباط همتا-به-همتا). Server-Sent Events پیادهسازی سادهتری دارند اما ارسال از کلاینت به سرور را پشتیبانی نمیکنند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید