Socket.IOIntermediate
Socket.IO Broadcasting Events
io.emit, socket.broadcast, volatile emit ও targeted broadcast — বাংলায় সম্পূর্ণ গাইড।
21টি অংশবাংলা ভাষায়
Broadcasting মানে একসাথে অনেককে একই event পাঠানো। Socket.IO-তে এটি করার জন্য কয়েকটি ভিন্ন API আছে — কোনটি কখন ব্যবহার করবেন, সেটিই এই অধ্যায়ের মূল কথা।
শেখার লক্ষ্য
io.emit,socket.emit,socket.broadcast.emit-এর পার্থক্য- নির্দিষ্ট room-এ broadcast
volatileemit কী এবং কখন দরকার- সবচেয়ে common ভুল (নিজেকে বার্তা পাঠানো) এড়ানো
চারটি Emit প্যাটার্ন
| API | কারা পায় |
|---|---|
socket.emit("ev", data) | শুধু নিজের socket |
socket.broadcast.emit("ev", data) | sender ছাড়া সব অন্যান্য socket |
io.emit("ev", data) | সবাই (sender সহ) |
io.to(room).emit("ev", data) | নির্দিষ্ট room-এর সবাই |
socket.to(room).emit("ev", data) | room-এর সবাই, sender ছাড়া |
broadcast patternsjavascript
javascript
io.on("connection", (socket) => {
// ১. sender কে reply
socket.emit("welcome", "আপনি যুক্ত হলেন");
// ২. sender ছাড়া সবাইকে জানান
socket.broadcast.emit("user:joined", socket.id);
// ৩. সবাইকে (sender-ও)
io.emit("online:count", io.engine.clientsCount);
// ৪. room-এ sender ছাড়া
socket.to("general").emit("notice", "নতুন সদস্য");
});সবচেয়ে সাধারণ ভুল
Chat message সবাইকে দেখাতে io.emit ব্যবহার করলে নিজের পাঠানো message-ও নিজেই আবার পাবেন — ফলে দুইবার দেখাবে (local render + echo)। সমাধানে socket.broadcast.emit ব্যবহার করুন, অথবা client-এ optimistic render করা choice-টি একটাই রাখুন।
Line-by-line: chat message flow
targeted broadcastjavascript
javascript
// client
socket.emit("chat:message", { room: "general", text: "হ্যালো" });
// server
io.on("connection", (socket) => {
socket.on("chat:message", (payload) => {
// শুধু room-এর বাকি সবাই পাবে, sender পাবে না
socket.to(payload.room).emit("chat:message", {
text: payload.text,
from: socket.id,
});
});
});socket.to(room)— sender বাদ দিয়ে room-এ পাঠায়- sender নিজের message local state-এ যোগ করতে পারে (তাই double render হবে না)
payload.roomclient থেকে আসছে, তাই server-side validation জরুরি
Volatile Emit
volatile মানে — যদি client সংযোগ-এ সমস্যায় না পায়, বার্তাটি বাতিল হয়ে যায়। Real-time tick, cursor position, live cursor — যেখানে পুরনো data পরে পৌঁছানো অর্থহীন, সেখানে ব্যবহার হয়:
volatile emitjavascript
javascript
// প্রতি 100ms-এ cursor position — হারিয়ে গেলেও ক্ষতি নেই
setInterval(() => {
socket.volatile.emit("cursor:move", { x: 120, y: 40 });
}, 100);- buffered থাকে না; network পিছিয়ে গেলে গুরুত্বহীন update drop হয়
- গুরুত্বপূর্ণ message (chat, order)
volatile-এ পাঠাবেন নয়
Use Cases
- Live presence — কে অনলাইনে এসেছে/গেছে
- Typing indicator — একজনের typing বাকিরা দেখল
- Live score / dashboard — সবাইকে একসাথে update
- Room announcement — room-এর নির্দিষ্ট সদস্যদের system message
সাধারণ ভুল ও সমাধান
io.emitvssocket.broadcast.emit— intent বুঝে বেছে নিন: সবাই চাইলেio, নাকি sender ছাড়া চাইলেbroadcast- Room নামের typo —
to("genral")আরto("general")আলাদা; নাম constant-এ রাখুন volatileদিয়ে জরুরি data — পাঠানো হয়নি ধরেই নিন; critical data-তে ack ব্যবহার করুন (Acknowledgements)
Practice Task
- ৩টি tab খুলে একটি
noticeevent broadcast করুন —io.emitওsocket.broadcast.emit-এর output তুলনা করুন - একটি
roomযোগ করে শুধু সেই room-এ broadcast করুন (পরের অধ্যায়ে দেখবেন) volatileদিয়ে প্রতি সেকেন্ডে time emit করে network throttle-এ কী হয় দেখুন
সম্পর্কিত অধ্যায়: Events · Rooms · Namespaces
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।