Socket.IO Emitting and Listening to Events
emit/on, custom events, payload, reserved events — Socket.IO event model বাংলায়।
Socket.IO-এর মূল শক্তি হলো event-based communication — আপনি কোনো বার্তাকে নাম দিয়ে পাঠান, আর অন্যপাশে সেই নামের listener সেটি ধরে। মনে করুন চিঠিতে খামের উপর নাম লেখা — কোন খামটা কে পাবে, কোথায় যাবে সব নাম দিয়ে ঠিক হয়।
শেখার লক্ষ্য
emit(পাঠানো) ওon(শোনা)-এর কাজ বোঝা- Custom event-নাম ও payload ব্যবহার করা
- Reserved events চেনা এবং দুর্ঘটনায় এড়ানো
Event Model
| পাশ | কাজ | উদাহরণ |
|---|---|---|
| Client → Server | socket.emit("eventName", payload) | socket.emit("message", text) |
| Server → Client | socket.emit(...) | socket.emit("message", text) |
| Server → সবাই | io.emit("eventName", payload) | io.emit("typing", user) |
Event-এর নাম নিজের পছন্দের — তবে string হতে হবে এবং reserved নাম বাদ দিতে হবে।
মৌলিক উদাহরণ
index.html client থেকে server-এ message পাঠাই, server আবার সবার কাছে echo করে:
const socket = io();
// পাঠানো:
socket.emit("message", "Hello from browser!");
// শোনা:
socket.on("message", (text) => {
console.log("Server থেকে:", text);
});io.on("connection", (socket) => {
// client থেকে 'message' আসলে
socket.on("message", (text) => {
console.log("Client বলল:", text);
// সব client-কে ফিরিয়ে পাঠাই (যার থেকে এসেছে-ও সহ)
io.emit("message", "Server: " + text);
});
});প্রবাহ:
- Client
socket.emit("message", "Hello...")— server-এরsocket.on("message", ...)-এ যায় - Server
io.emit("message", ...)— সব connected socket-এই echo হয় - নিজের client-র
socket.on("message", ...)সেটি print করে
io.emit পাঠানো client-ও পায়। যদি শুধু অন্যদের চাই (sender ছাড়া), তাহলে socket.broadcast.emit — গাইড দেখুন Broadcasting Events।
Payload-এ object পাঠানো
একটি event-এ যত খুশি argument (ডেটা) পাঠানো যায় — object, string, number, array, এমনকি binary:
// client
socket.emit("newMessage", {
user: "রহিম",
text: "আসসালামু আলাইকুম",
time: Date.now(),
});
// server
socket.on("newMessage", (data) => {
console.log(data.user, " says:", data.text);
io.emit("newMessage", data);
});Socket.IO payload JSON-serializable হওয়া উচিত — plain object, array, string, number, boolean, Buffer/ArrayBuffer। Function বা circular object পাঠাবেন না; binary ডেটা খুব বড় হলে Sending and Receiving Data lesson-এ max size নিয়ন্ত্রণ দেখুন।
Reserved Events (এড়িয়ে চলুন)
Socket.IO নিজে এই নামগুলো ব্যবহার করে, তাই custom event-এর নামে ব্যবহার করবেন না:
connect,disconnect,connect_error,disconnectingping,pongreconnect,reconnect_attempt,reconnect_error,reconnect_failednewListener,removeListener(Node EventEmitter থেকে)
socket.on("connect") বা socket.on("ping") দিলে অপ্রত্যাশিত আচরণ আসতে পারে — custom event-এর নাম যেমন user:joined, chat:message ব্যবহার করুন।
Use Case: Typing Indicator
// client typing event
inputEl.addEventListener("input", () => {
socket.emit("typing", "রহিম typing...");
});
socket.on("typing", (text) => {
statusEl.textContent = text;
});
// server pass-through
socket.on("typing", (text) => socket.broadcast.emit("typing", text));সাধারণ ভুল ও সমাধান
- Event নামের typo —
emit("messag")আরon("message")কখনো মিলবে না; নাম constant-এ রাখুন - Listener register না করা — emit-এর আগেই on-কে receiver-এ setup করুন
- Reserved নাম ব্যবহার — উপরোক্ত list থেকে দূরে থাকুন
Practice Task
- একটি
greetingevent তৈরি করুন — client পাঠাবে"Hi server", server ফিরতি"Hi client"পাঠাবে - Object payload সহ
user:joinedevent-এ ২টি argument (name, room) পাঠিয়ে দেখুন
সম্পর্কিত অধ্যায়: Sending and Receiving Data · Broadcasting Events · Rooms