Socket.IO Sending and Receiving Data
payload types, multiple arguments, binary data, large payload নিয়ন্ত্রণ — Socket.IO data বাংলায়।
Socket.IO-তে event-এর সাথে যেকোনো JSON-serializable ডেটা অথবা binary পাঠানো যায়। কয়েকটা topic-এ একসাথে ডেটা পাঠানোর সুবিধাটা বুঝে নেওয়া যাক।
শেখার লক্ষ্য
- কোন কোন type-এর ডেটা পাঠানো যায় তা জানা
- একাধিক argument দেওয়া
- Binary (files, audio, image) পাঠানো
- বড় payload-এর সীমা নিয়ন্ত্রণ করা
কী কী পাঠানো যায়?
| Type | উদাহরণ |
|---|---|
| string | "hello" |
| number | 42 |
| boolean | true |
| object | { user: "রহিম", score: 10 } |
| array | ["a", "b", "c"] |
| Buffer / ArrayBuffer | image, audio bytes |
| null / undefined | খালি পেলোড |
একাধিক Argument
// server
socket.on("giveMeData", (name, age, active) => {
console.log(name, age, active); // রহিম 25 true
});
// client
socket.emit("giveMeData", "রহিম", 25, true);একটার মধ্যে সব রেখে object পাঠানোও সমান ভালো। ৩-এর বেশি argument হলে object ব্যবহার করা cleaner — ভবিষ্যতে field যোগ/বাদ পড়লে client-server contract এত fragile থাকে না।
Line-by-line: data validation
socket.on("newMessage", (data) => {
// 1. check: data object কি না
if (!data || typeof data !== "object") return;
// 2. field sanitize
const text = String(data.text || "").slice(0, 500);
const user = String(data.user || "anonymous").slice(0, 50);
if (!text.trim()) return; // খালি message ignore
io.emit("newMessage", { user, text });
});- আগে validate — client-এর থেকে যা-ই আসে তা বিশ্বাস-যোগ্য না; type-check অপরিহার্য
- Length limit —
text.slice(0, 500)বড়/ফেক payload ঠেকায় - trim — খালি বার্তা broadcast-এ আটকায়
socket.broadcast.emit-এর আগে input validate করার উপর বেশি জোর দিন। client-এর পাঠানো object-এর property-তে access-এর আগেই check না করলে crash হতে পারে। Security সম্পর্কে: Best Practices।
Binary Data পাঠানো
Socket.IO binary payload support করে — Buffer (Node) / ArrayBuffer, Blob (browser):
// client — file পাঠানো
const fileInput = document.querySelector("input[type=file]");
fileInput.addEventListener("change", (e) => {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = () => {
// মেটাডেটা + bytes arrayBuffer
socket.emit("upload", {
name: file.name,
size: file.size,
data: reader.result,
});
};
reader.readAsArrayBuffer(file);
});socket.on("upload", ({ name, size, data }) => {
console.log("File:", name, "| size:", size);
// অন্য sockets-এ forward
socket.broadcast.emit("upload", {
name,
size,
data, // Buffer object
});
});ডিফল্ট maxHttpBufferSize 1 MB — এর চেয়ে বড় file পাঠাতে server option-এ limit বাড়াতে হবে (নিচে)। তবে production-এ বড় file সাধারণত REST/object storage (S3 ইত্যাদি) দিয়ে upload হয়, socket শুধু notify করে — এই pattern-ই বেশি প্রচলিত।
বড় Payload নিয়ন্ত্রণ
const io = new Server(3000, {
cors: { origin: "*" },
// ডিফল্ট 1 MB (10^6) — প্রয়োজনে বাড়ান
maxHttpBufferSize: 5 * 1024 * 1024, // 5 MB
});- এই সীমার উপরে গেলে connection error নিয়ে event fail হয়
- খুব ছোট সীমা রাখলে legit data-ও কাটা পড়তে পারে — use case অনুযায়ী সমন্বয়
সাধারণ ভুল ও সমাধান
- Function / circular object পাঠানো — serialization fail; plain data-ই রাখুন
undefineditem-এ access — server-এ type guard না দিলে crash- Large binary default limit —
maxHttpBufferSizeনা বাড়ালে silently drop
Practice Task
- client থেকে
{ user, text }-এর object পাঠিয়ে server-এ validate-সহ echo করুন - 2MB-এর একটি file upload করুন — প্রথমে default limit এ কী হয় দেখুন, তারপর 5MB limit দিয়ে
- multi-argument vs object — কোনটা code-এ বুঝতে সহজ, নিজেই লক্ষ্য করুন
সম্পর্কিত অধ্যায়: Events · Broadcasting Events · Acknowledgements