Socket.IO Rooms
join/leave, room-এ emit, adapter ও real-world use case — Socket.IO rooms বাংলায়।
Room হলো socket-এর একটি দল। একজন client একাধিক room-এ থাকতে পারে, আর একটি বার্তা শুধু নির্দিষ্ট room-এর সদস্যরাই পায়। Chat channel, game lobby, project group — এসবের ভিত্তি হলো room।
শেখার লক্ষ্য
- room-এ join/leave করা
- নির্দিষ্ট room-এ বার্তা পাঠানো
- disconnect-এর সময় room cleanup
- room তথ্য inspect করা
Room-এ Join ও Leave
io.on("connection", (socket) => {
// room-এ যোগ দিন
socket.join("general");
// একাধিক room একসাথে
socket.join(["general", "news"]);
// room ছেড়ে দিন
socket.leave("news");
// disconnected হলে Socket.IO নিজেই সব room থেকে বের করে দেয়
socket.on("disconnect", () => {
console.log(socket.id, "left all rooms");
});
});socket.join(room) ও socket.leave(room) synchronous ভাবে room membership বদলায়। disconnect হলে Socket.IO নিজেই সংশ্লিষ্ট সব room থেকে socket-কে সরিয়ে দেয় — হাতে leave লিখতে হয় না।
Room-এ Emit
// sender ছাড়া room-এর বাকি সবাই
socket.to("general").emit("chat:message", {
from: socket.id,
text: "হ্যালো room!",
});
// room-এর সবাই (sender সহ)
io.to("general").emit("announcement", "Meeting শুরু হলো");
// একাধিক room একসাথে
io.to("general").to("news").emit("event", "কমন খবর");io.to(roomA).to(roomB) লিখলে A অথবা B — যে-ই roomA-তে, roomB-তে, বা দুটোতেই আছে — সে পাবে (union)। sender কে বাদ দিতে socket.to(...), আর একটি room-এর বাইরের সবাইকে io.except(room).emit(...) ব্যবহার করুন।
Line-by-line: join a room
socket.on("room:join", (roomName) => {
// 1. input validate
if (typeof roomName !== "string" || !roomName.trim()) return;
const room = roomName.trim().toLowerCase().slice(0, 40);
// 2. room-এ ঢুকুন
socket.join(room);
// 3. room-এর বাইরে সবাইকে জানান
socket.to(room).emit("room:joined", {
id: socket.id,
room,
});
// 4. sender-কে reply — নতুন সদস্যকে স্বাগত
socket.emit("room:welcome", `আপনি "${room}" room-এ আছেন`);
});- Step 1 — client-এর room নাম বিশ্বাস করে সরাসরি
joinকরবেন না; validate করুন - Step 2 — membership বদলান
- Step 3 — অন্যান্য সদস্যকে notify (
socket.to(room), sender বাদ) - Step 4 —
.emitsender-কে, welcome message
Room Inspect করা (adapter)
// একটি socket কোন কোন room-এ আছে (v4: socket.rooms একটি Set)
console.log(socket.rooms); // Set(2) { <socketId>, "general" }
// একটি room-এর সদস্যসংখ্যা
const size = await io.in("general").fetchSockets();
console.log("general room-এ:", size.length);
// সব room-এর map
console.log(io.sockets.adapter.rooms);একাধিক server process/node-এ চালালে in-memory room তথ্য প্রতি node-এ আলাদা থাকে। তখন Redis adapter (@socket.io/redis-adapter) লাগবে, যাতে সব node একই room mapping শেয়ার করে। বিস্তারিত Best Practices-এ।
Use Case: Chat Channels
general,random,support— আলাদা room- user room বেছে নিলে
socket.join(room) - message পাঠালে
socket.to(room).emit(...) - room ছাড়লে message আর আসে না
সাধারণ ভুল ও সমাধান
- Room নাম normalize না করা —
"General"আর"general"কে আলাদা ধরে; সবসময়toLowerCase()/trim - Leave না করা — user channel বদলালে পুরনো room-এ থেকে গেলে ভুল room-এ message আসে
io.emitব্যবহার করে room-এর পরিবর্তে — সবার কাছে চলে যাবে; room scope ভেঙে যায়
Practice Task
- ২টি room (
general,random) বানান; ২ browser-এ ভিন্ন room-এ join করে দেখুন কে কোন message পায় socket.roomslog করে নিজের socket কোথায় আছে তা verify করুন- room history-এর জন্য সর্বশেষ ৫টি message রাখা practice করুন
সম্পর্কিত অধ্যায়: Broadcasting Events · Namespaces · Private and Group Messaging