فارسی

کاوش در جریان‌سازی داده بی‌درنگ با Socket.IO، شامل راه‌اندازی، پیاده‌سازی، مقیاس‌پذیری و بهترین شیوه‌ها برای برنامه‌های جهانی.

جریان‌سازی داده بی‌درنگ: راهنمای پیاده‌سازی Socket.IO

در چشم‌انداز دیجیتال پرسرعت امروز، جریان‌سازی داده بی‌درنگ برای برنامه‌هایی که به به‌روزرسانی‌های فوری و ارتباطات یکپارچه نیاز دارند، حیاتی است. از برنامه‌های چت زنده گرفته تا داشبوردهای تحلیل بی‌درنگ، توانایی انتقال فوری داده‌ها تجربه کاربری را بهبود بخشیده و مزیت رقابتی فراهم می‌کند. Socket.IO، یک کتابخانه محبوب جاوا اسکریپت، پیاده‌سازی ارتباطات دوطرفه بی‌درنگ بین کلاینت‌های وب و سرورها را ساده می‌کند. این راهنمای جامع شما را در فرآیند راه‌اندازی و پیاده‌سازی جریان‌سازی داده بی‌درنگ با استفاده از Socket.IO، شامل مفاهیم ضروری، مثال‌های عملی و بهترین شیوه‌ها برای برنامه‌های جهانی، همراهی خواهد کرد.

جریان‌سازی داده بی‌درنگ چیست؟

جریان‌سازی داده بی‌درنگ شامل انتقال مداوم و فوری داده از یک منبع به یک مقصد، بدون تأخیر قابل توجه است. برخلاف مدل‌های سنتی درخواست-پاسخ که در آن کلاینت‌ها باید به طور مکرر درخواست به‌روزرسانی کنند، جریان‌سازی بی‌درنگ به سرورها اجازه می‌دهد تا به محض در دسترس قرار گرفتن داده‌ها، آنها را به کلاینت‌ها ارسال (push) کنند. این رویکرد برای برنامه‌هایی که به اطلاعات لحظه‌ای نیاز دارند ضروری است، مانند:

مزایای جریان‌سازی داده بی‌درنگ عبارتند از:

معرفی Socket.IO

Socket.IO یک کتابخانه جاوا اسکریپت است که ارتباطات بی‌درنگ، دوطرفه و مبتنی بر رویداد را بین کلاینت‌های وب و سرورها امکان‌پذیر می‌کند. این کتابخانه پیچیدگی‌های پروتکل‌های انتقال زیربنایی مانند WebSockets را پنهان کرده و یک API ساده و شهودی برای ساخت برنامه‌های بی‌درنگ فراهم می‌کند. Socket.IO با ایجاد یک اتصال پایدار بین کلاینت و سرور کار می‌کند و به هر دو طرف اجازه می‌دهد تا داده‌ها را به صورت بی‌درنگ ارسال و دریافت کنند.

ویژگی‌های کلیدی Socket.IO عبارتند از:

راه‌اندازی یک پروژه Socket.IO

برای شروع کار با Socket.IO، باید Node.js و npm (مدیر بسته Node) را روی سیستم خود نصب داشته باشید. مراحل زیر را برای راه‌اندازی یک پروژه پایه Socket.IO دنبال کنید:

۱. ایجاد یک پوشه برای پروژه

یک پوشه جدید برای پروژه خود ایجاد کرده و وارد آن شوید:

mkdir socketio-example
cd socketio-example

۲. مقداردهی اولیه یک پروژه Node.js

یک پروژه جدید Node.js را با استفاده از npm مقداردهی اولیه کنید:

npm init -y

۳. نصب Socket.IO و Express

Socket.IO و Express، یک فریم‌ورک وب محبوب Node.js، را به عنوان وابستگی‌ها نصب کنید:

npm install socket.io express

۴. ایجاد کد سمت سرور (index.js)

فایلی به نام `index.js` ایجاد کرده و کد زیر را به آن اضافه کنید:

const express = require('express');
const http = require('http');
const { Server } = require("socket.io");

const app = express();
const server = http.createServer(app);
const io = new Server(server);

const port = 3000;

app.get('/', (req, res) => {
 res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
 console.log('A user connected');

 socket.on('disconnect', () => {
 console.log('User disconnected');
 });

 socket.on('chat message', (msg) => {
 io.emit('chat message', msg); // پیام را به تمام کلاینت‌های متصل منتشر کن
 console.log('message: ' + msg);
 });
});

server.listen(port, () => {
 console.log(`Server listening on port ${port}`);
});

این کد یک سرور Express را راه‌اندازی کرده و Socket.IO را با آن یکپارچه می‌کند. این کد به اتصالات ورودی گوش داده و رویدادهایی مانند 'connection'، 'disconnect' و 'chat message' را مدیریت می‌کند.

۵. ایجاد کد سمت کلاینت (index.html)

فایلی به نام `index.html` در همان پوشه ایجاد کرده و کد زیر را به آن اضافه کنید:




 Socket.IO Chat
 


 

    این فایل HTML یک رابط کاربری چت ساده با یک فیلد ورودی برای ارسال پیام‌ها و یک لیست برای نمایش پیام‌های دریافتی راه‌اندازی می‌کند. همچنین شامل کتابخانه کلاینت Socket.IO و کد جاوا اسکریپت برای مدیریت ارسال و دریافت پیام است.

    ۶. اجرای برنامه

    سرور Node.js را با اجرای دستور زیر در ترمینال خود شروع کنید:

    node index.js

    مرورگر وب خود را باز کرده و به `http://localhost:3000` بروید. باید رابط کاربری چت را ببینید. چندین پنجره یا تب مرورگر را برای شبیه‌سازی کاربران متعدد باز کنید. در یک پنجره پیامی تایپ کرده و Enter را فشار دهید؛ باید ببینید که پیام به صورت بی‌درنگ در تمام پنجره‌های باز ظاهر می‌شود.

    مفاهیم اصلی Socket.IO

    درک مفاهیم اصلی Socket.IO برای ساخت برنامه‌های بی‌درنگ قوی و مقیاس‌پذیر ضروری است.

    ۱. اتصالات (Connections)

    یک اتصال نشان‌دهنده یک پیوند پایدار بین یک کلاینت و سرور است. هنگامی که یک کلاینت با استفاده از Socket.IO به سرور متصل می‌شود، یک شیء سوکت منحصر به فرد هم در کلاینت و هم در سرور ایجاد می‌شود. این شیء سوکت برای برقراری ارتباط با یکدیگر استفاده می‌شود.

    // سمت سرور
    io.on('connection', (socket) => {
     console.log('A user connected with socket ID: ' + socket.id);
    
     socket.on('disconnect', () => {
     console.log('User disconnected');
     });
    });
    
    // سمت کلاینت
    var socket = io();

    ۲. رویدادها (Events)

    رویدادها مکانیزم اصلی برای تبادل داده بین کلاینت‌ها و سرور هستند. Socket.IO از یک API مبتنی بر رویداد استفاده می‌کند که به شما امکان می‌دهد رویدادهای سفارشی تعریف کرده و آنها را با اقدامات خاصی مرتبط کنید. کلاینت‌ها می‌توانند رویدادهایی را به سرور ارسال کنند و سرور نیز می‌تواند رویدادهایی را به کلاینت‌ها ارسال کند.

    // سمت سرور
    io.on('connection', (socket) => {
     socket.on('custom event', (data) => {
     console.log('Received data:', data);
     socket.emit('response event', { message: 'Data received' });
     });
    });
    
    // سمت کلاینت
    socket.emit('custom event', { message: 'Hello from client' });
    
    socket.on('response event', (data) => {
     console.log('Received response:', data);
    });

    ۳. انتشار (Broadcasting)

    انتشار به شما امکان می‌دهد داده‌ها را به چندین کلاینت متصل به طور همزمان ارسال کنید. Socket.IO گزینه‌های مختلفی برای انتشار فراهم می‌کند، مانند ارسال داده به تمام کلاینت‌های متصل، ارسال داده به کلاینت‌ها در یک اتاق خاص، یا ارسال داده به تمام کلاینت‌ها به جز فرستنده.

    // سمت سرور
    io.on('connection', (socket) => {
     socket.on('new message', (msg) => {
     // انتشار به تمام کلاینت‌های متصل
     io.emit('new message', msg);
    
     // انتشار به تمام کلاینت‌ها به جز فرستنده
     socket.broadcast.emit('new message', msg);
     });
    });

    ۴. اتاق‌ها (Rooms)

    اتاق‌ها راهی برای گروه‌بندی کلاینت‌ها و ارسال داده فقط به کلاینت‌های درون یک اتاق خاص هستند. این قابلیت برای سناریوهایی که نیاز به هدف قرار دادن گروه‌های خاصی از کاربران دارید، مانند اتاق‌های چت یا جلسات بازی آنلاین، مفید است. کلاینت‌ها می‌توانند به صورت پویا به اتاق‌ها بپیوندند یا از آنها خارج شوند.

    // سمت سرور
    io.on('connection', (socket) => {
     socket.on('join room', (room) => {
     socket.join(room);
     console.log(`User ${socket.id} joined room ${room}`);
    
     // ارسال پیام به تمام کلاینت‌های داخل اتاق
     io.to(room).emit('new user joined', `User ${socket.id} joined the room`);
     });
    
     socket.on('send message', (data) => {
     // ارسال پیام به تمام کلاینت‌های داخل اتاق
     io.to(data.room).emit('new message', data.message);
     });
    
     socket.on('leave room', (room) => {
     socket.leave(room);
     console.log(`User ${socket.id} left room ${room}`);
     });
    });
    
    // سمت کلاینت
    socket.emit('join room', 'room1');
    socket.emit('send message', { room: 'room1', message: 'Hello from room1' });
    
    socket.on('new message', (message) => {
     console.log('Received message:', message);
    });

    ۵. فضاهای نام (Namespaces)

    فضاهای نام به شما امکان می‌دهند یک اتصال TCP واحد را برای اهداف متعدد چندگانه کنید و منطق برنامه خود را بر روی یک اتصال زیربنایی مشترک تقسیم کنید. آنها را به عنوان «سوکت‌های» مجازی جداگانه در همان سوکت فیزیکی در نظر بگیرید. ممکن است از یک فضای نام برای یک برنامه چت و از دیگری برای یک بازی استفاده کنید. این کار به سازماندهی و مقیاس‌پذیری کانال‌های ارتباطی کمک می‌کند.

    //سمت سرور
    const chatNsp = io.of('/chat');
    
    chatNsp.on('connection', (socket) => {
     console.log('someone connected to chat');
     // ... رویدادهای چت شما ...
    });
    
    const gameNsp = io.of('/game');
    
    gameNsp.on('connection', (socket) => {
     console.log('someone connected to game');
     // ... رویدادهای بازی شما ...
    });
    
    //سمت کلاینت
    const chatSocket = io('/chat');
    const gameSocket = io('/game');
    
    chatSocket.emit('chat message', 'Hello from chat!');
    gameSocket.emit('game action', 'Player moved!');

    پیاده‌سازی ویژگی‌های بی‌درنگ با Socket.IO

    بیایید بررسی کنیم که چگونه برخی از ویژگی‌های رایج بی‌درنگ را با استفاده از Socket.IO پیاده‌سازی کنیم.

    ۱. ساخت یک برنامه چت بی‌درنگ

    برنامه چت پایه‌ای که قبلاً ایجاد کردیم، اصول اساسی چت بی‌درنگ را نشان می‌دهد. برای بهبود آن، می‌توانید ویژگی‌هایی مانند این موارد را اضافه کنید:

    در اینجا مثالی از اضافه کردن نشانگرهای تایپ آورده شده است:

    // سمت سرور
    io.on('connection', (socket) => {
     socket.on('typing', (username) => {
     // انتشار به تمام کلاینت‌ها به جز فرستنده
     socket.broadcast.emit('typing', username);
     });
    
     socket.on('stop typing', (username) => {
     // انتشار به تمام کلاینت‌ها به جز فرستنده
     socket.broadcast.emit('stop typing', username);
     });
    });
    
    // سمت کلاینت
    input.addEventListener('input', () => {
     socket.emit('typing', username);
    });
    
    input.addEventListener('blur', () => {
     socket.emit('stop typing', username);
    });
    
    socket.on('typing', (username) => {
     typingIndicator.textContent = `${username} is typing...`;
    });
    
    socket.on('stop typing', () => {
     typingIndicator.textContent = '';
    });

    ۲. ایجاد یک داشبورد تحلیل بی‌درنگ

    داشبوردهای تحلیل بی‌درنگ، معیارها و روندهای به‌روز را نمایش می‌دهند و بینش‌های ارزشمندی در مورد عملکرد کسب‌وکار فراهم می‌کنند. شما می‌توانید از Socket.IO برای جریان‌سازی داده از یک منبع داده به داشبورد به صورت بی‌درنگ استفاده کنید.

    در اینجا یک مثال ساده آورده شده است:

    // سمت سرور
    const data = {
     pageViews: 1234,
     usersOnline: 567,
     conversionRate: 0.05
    };
    
    setInterval(() => {
     data.pageViews += Math.floor(Math.random() * 10);
     data.usersOnline += Math.floor(Math.random() * 5);
     data.conversionRate = Math.random() * 0.1;
    
     io.emit('dashboard update', data);
    }, 2000); // هر 2 ثانیه یک بار داده‌ها را ارسال کن
    
    // سمت کلاینت
    socket.on('dashboard update', (data) => {
     document.getElementById('pageViews').textContent = data.pageViews;
     document.getElementById('usersOnline').textContent = data.usersOnline;
     document.getElementById('conversionRate').textContent = data.conversionRate.toFixed(2);
    });

    ۳. توسعه یک ابزار ویرایش مشارکتی

    ابزارهای ویرایش مشارکتی به چندین کاربر اجازه می‌دهند تا اسناد یا کد را به طور همزمان ویرایش کنند. Socket.IO می‌تواند برای همگام‌سازی تغییرات بین کاربران به صورت بی‌درنگ استفاده شود.

    در اینجا یک مثال پایه آورده شده است:

    // سمت سرور
    io.on('connection', (socket) => {
     socket.on('text change', (data) => {
     // تغییرات را به تمام کلاینت‌های دیگر در همان اتاق منتشر کن
     socket.broadcast.to(data.room).emit('text change', data.text);
     });
    });
    
    // سمت کلاینت
    textarea.addEventListener('input', () => {
     socket.emit('text change', { room: roomId, text: textarea.value });
    });
    
    socket.on('text change', (text) => {
     textarea.value = text;
    });

    مقیاس‌پذیری برنامه‌های Socket.IO

    با رشد برنامه Socket.IO شما، باید به مقیاس‌پذیری توجه کنید. Socket.IO برای مقیاس‌پذیری طراحی شده است، اما برای مدیریت تعداد زیادی از اتصالات همزمان، باید استراتژی‌های خاصی را پیاده‌سازی کنید.

    ۱. مقیاس‌پذیری افقی

    مقیاس‌پذیری افقی شامل توزیع برنامه شما در چندین سرور است. این کار را می‌توان با استفاده از یک متعادل‌کننده بار (load balancer) برای توزیع اتصالات ورودی بین سرورهای موجود انجام داد. با این حال، با Socket.IO، باید اطمینان حاصل کنید که کلاینت‌ها به طور مداوم به همان سرور برای مدت زمان اتصالشان هدایت می‌شوند. این به این دلیل است که Socket.IO برای حفظ وضعیت اتصال به ساختارهای داده در حافظه متکی است. معمولاً استفاده از جلسات چسبنده (sticky sessions/session affinity) ضروری است.

    ۲. آداپتور Redis

    آداپتور Redis برای Socket.IO به شما امکان می‌دهد رویدادها را بین چندین سرور Socket.IO به اشتراک بگذارید. این آداپتور از Redis، یک ذخیره‌ساز داده در حافظه، برای انتشار رویدادها در تمام سرورهای متصل استفاده می‌کند. این به شما امکان می‌دهد برنامه خود را به صورت افقی بدون از دست دادن وضعیت اتصال، مقیاس‌بندی کنید.

    // سمت سرور
    const { createAdapter } = require('@socket.io/redis-adapter');
    const { createClient } = require('redis');
    
    const pubClient = createClient({ host: 'localhost', port: 6379 });
    const subClient = pubClient.duplicate();
    
    Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
     io.adapter(createAdapter(pubClient, subClient));
     io.listen(3000);
    });

    ۳. متعادل‌سازی بار

    یک متعادل‌کننده بار برای توزیع ترافیک بین چندین سرور Socket.IO حیاتی است. راه‌حل‌های رایج متعادل‌سازی بار شامل Nginx، HAProxy و متعادل‌کننده‌های بار مبتنی بر ابر مانند AWS Elastic Load Balancing یا Google Cloud Load Balancing هستند. متعادل‌کننده بار خود را برای استفاده از جلسات چسبنده (sticky sessions) پیکربندی کنید تا اطمینان حاصل شود که کلاینت‌ها به طور مداوم به همان سرور هدایت می‌شوند.

    ۴. مقیاس‌پذیری عمودی

    مقیاس‌پذیری عمودی شامل افزایش منابع (CPU، حافظه) یک سرور واحد است. در حالی که پیاده‌سازی این روش ساده‌تر از مقیاس‌پذیری افقی است، اما محدودیت‌هایی دارد. در نهایت، به نقطه‌ای خواهید رسید که دیگر نمی‌توانید منابع یک سرور واحد را افزایش دهید.

    ۵. بهینه‌سازی کد

    نوشتن کد کارآمد می‌تواند به طور قابل توجهی عملکرد برنامه Socket.IO شما را بهبود بخشد. از محاسبات غیرضروری اجتناب کنید، انتقال داده را به حداقل برسانید و کوئری‌های پایگاه داده خود را بهینه کنید. ابزارهای پروفایلینگ می‌توانند به شما در شناسایی گلوگاه‌های عملکرد کمک کنند.

    بهترین شیوه‌ها برای پیاده‌سازی Socket.IO

    برای اطمینان از موفقیت پروژه Socket.IO خود، این بهترین شیوه‌ها را در نظر بگیرید:

    ۱. ایمن‌سازی اتصالات

    از وب‌سوکت‌های امن (WSS) برای رمزگذاری ارتباط بین کلاینت‌ها و سرور استفاده کنید. این کار از داده‌های حساس در برابر استراق سمع و دستکاری محافظت می‌کند. یک گواهی SSL برای دامنه خود تهیه کرده و سرور خود را برای استفاده از WSS پیکربندی کنید.

    ۲. پیاده‌سازی احراز هویت و مجوزدهی

    احراز هویت را برای تأیید هویت کاربران و مجوزدهی را برای کنترل دسترسی به منابع پیاده‌سازی کنید. این کار از دسترسی غیرمجاز جلوگیری کرده و برنامه شما را از حملات مخرب محافظت می‌کند. از مکانیزم‌های احراز هویت معتبر مانند JWT (توکن‌های وب JSON) یا OAuth استفاده کنید.

    ۳. مدیریت خطاها به صورت زیبا

    مدیریت خطای مناسب را برای مدیریت زیبای خطاهای غیرمنتظره و جلوگیری از کرش کردن برنامه پیاده‌سازی کنید. خطاها را برای اهداف اشکال‌زدایی و نظارت ثبت کنید. پیام‌های خطای آموزنده به کاربران ارائه دهید.

    ۴. استفاده از مکانیزم ضربان قلب (Heartbeat)

    Socket.IO یک مکانیزم ضربان قلب داخلی دارد، اما شما باید آن را به درستی پیکربندی کنید. یک فاصله پینگ (ping interval) و مهلت زمانی پینگ (ping timeout) معقول تنظیم کنید تا اتصالات مرده را شناسایی و مدیریت کنید. منابع مرتبط با کلاینت‌های قطع شده را برای جلوگیری از نشت حافظه پاکسازی کنید.

    ۵. نظارت بر عملکرد

    عملکرد برنامه Socket.IO خود را برای شناسایی مشکلات احتمالی و بهینه‌سازی عملکرد نظارت کنید. معیارهایی مانند تعداد اتصالات، تأخیر پیام و استفاده از CPU را ردیابی کنید. از ابزارهای نظارتی مانند Prometheus، Grafana یا New Relic استفاده کنید.

    ۶. پاکسازی ورودی کاربر

    همیشه ورودی کاربر را برای جلوگیری از حملات اسکریپت‌نویسی بین سایتی (XSS) و سایر آسیب‌پذیری‌های امنیتی پاکسازی کنید. داده‌های ارائه‌شده توسط کاربر را قبل از نمایش در مرورگر کدگذاری کنید. از اعتبارسنجی ورودی برای اطمینان از انطباق داده‌ها با فرمت‌های مورد انتظار استفاده کنید.

    ۷. محدودسازی نرخ درخواست

    محدودسازی نرخ درخواست را برای محافظت از برنامه خود در برابر سوءاستفاده پیاده‌سازی کنید. تعداد درخواست‌هایی را که یک کاربر می‌تواند در یک دوره زمانی مشخص ارسال کند، محدود کنید. این کار از حملات محروم‌سازی از سرویس (DoS) جلوگیری کرده و از منابع سرور شما محافظت می‌کند.

    ۸. فشرده‌سازی

    فشرده‌سازی را برای کاهش حجم داده‌های منتقل شده بین کلاینت‌ها و سرور فعال کنید. این کار می‌تواند به طور قابل توجهی عملکرد را بهبود بخشد، به ویژه برای برنامه‌هایی که مقادیر زیادی داده منتقل می‌کنند. Socket.IO از فشرده‌سازی با استفاده از میان‌افزار `compression` پشتیبانی می‌کند.

    ۹. انتخاب پروتکل انتقال مناسب

    Socket.IO به طور پیش‌فرض از WebSockets استفاده می‌کند اما در صورت عدم دسترسی به WebSockets به روش‌های دیگر (مانند HTTP long polling) باز می‌گردد. در حالی که Socket.IO این کار را به طور خودکار انجام می‌دهد، پیامدهای آن را درک کنید. WebSockets معمولاً کارآمدترین روش هستند. در محیط‌هایی که WebSockets اغلب مسدود می‌شوند (برخی شبکه‌های شرکتی، فایروال‌های محدودکننده)، ممکن است نیاز به در نظر گرفتن پیکربندی‌ها یا معماری‌های جایگزین داشته باشید.

    ۱۰. ملاحظات جهانی: بومی‌سازی و مناطق زمانی

    هنگام ساخت برنامه‌ها برای مخاطبان جهانی، به بومی‌سازی توجه داشته باشید. اعداد، تاریخ‌ها و ارزها را مطابق با منطقه کاربر قالب‌بندی کنید. مناطق زمانی را به درستی مدیریت کنید تا اطمینان حاصل شود که رویدادها در زمان محلی کاربر نمایش داده می‌شوند. از کتابخانه‌های بین‌المللی‌سازی (i18n) برای ساده‌سازی فرآیند بومی‌سازی برنامه خود استفاده کنید.

    مثال: مدیریت منطقه زمانی

    فرض کنید سرور شما زمان رویدادها را به وقت جهانی هماهنگ (UTC) ذخیره می‌کند. می‌توانید از کتابخانه‌ای مانند `moment-timezone` برای نمایش زمان رویداد در منطقه زمانی محلی کاربر استفاده کنید.

    // سمت سرور (ارسال زمان رویداد به وقت UTC)
    const moment = require('moment');
    
    io.on('connection', (socket) => {
     socket.on('request event', () => {
     const eventTimeUTC = moment.utc(); // زمان فعلی به وقت UTC
     socket.emit('event details', {
     timeUTC: eventTimeUTC.toISOString(),
     description: 'Global conference call'
     });
     });
    });
    
    // سمت کلاینت (نمایش در زمان محلی کاربر)
    const moment = require('moment-timezone');
    
    socket.on('event details', (data) => {
     const eventTimeLocal = moment.utc(data.timeUTC).tz(moment.tz.guess()); // تبدیل به منطقه زمانی کاربر
     document.getElementById('eventTime').textContent = eventTimeLocal.format('MMMM Do YYYY, h:mm:ss a z');
    });

    مثال: قالب‌بندی ارز

    برای نمایش صحیح مقادیر ارزی، از کتابخانه‌ای مانند `Intl.NumberFormat` برای قالب‌بندی ارز مطابق با منطقه کاربر استفاده کنید.

    // سمت کلاینت
    const priceUSD = 1234.56;
    const userLocale = navigator.language || 'en-US'; // تشخیص منطقه کاربر
    
    const formatter = new Intl.NumberFormat(userLocale, {
     style: 'currency',
     currency: 'USD', // از دلار آمریکا به عنوان نقطه شروع استفاده کنید، در صورت نیاز تنظیم کنید
    });
    
    const formattedPrice = formatter.format(priceUSD);
    
    document.getElementById('price').textContent = formattedPrice;
    
    // برای نمایش قیمت‌ها با ارز دیگر:
    const formatterEUR = new Intl.NumberFormat(userLocale, {
     style: 'currency',
     currency: 'EUR',
    });
    
    const priceEUR = 1100.00;
    const formattedPriceEUR = formatterEUR.format(priceEUR);
    
    document.getElementById('priceEUR').textContent = formattedPriceEUR;

    نتیجه‌گیری

    Socket.IO پیاده‌سازی جریان‌سازی داده بی‌درنگ را در برنامه‌های وب ساده می‌کند. با درک مفاهیم اصلی Socket.IO، پیاده‌سازی بهترین شیوه‌ها و مقیاس‌بندی مناسب برنامه خود، می‌توانید برنامه‌های بی‌درنگ قوی و مقیاس‌پذیری بسازید که پاسخگوی نیازهای چشم‌انداز دیجیتال امروز باشند. چه در حال ساخت یک برنامه چت، یک داشبورد تحلیل بی‌درنگ یا یک ابزار ویرایش مشارکتی باشید، Socket.IO ابزارها و انعطاف‌پذیری لازم برای ایجاد تجربیات کاربری جذاب و پاسخگو برای مخاطبان جهانی را فراهم می‌کند.