Socket.IO এর মাধ্যমে binary data এবং buffer ব্যবহার করে ফাইল আদান-প্রদান করা সম্ভব। এটি বিশেষভাবে বড় ডেটা বা ফাইলের জন্য উপযোগী, যেখানে সাধারণ টেক্সট ডেটা এর চেয়ে বেশি জায়গা নেয়। ফাইল আদান-প্রদান করতে Buffer ব্যবহার করা হয়, যা Node.js তে বাইনারি ডেটাকে প্রক্রিয়া করতে সহায়তা করে।
এখানে Socket.IO এবং Buffer ব্যবহার করে কিভাবে ফাইল পাঠানো ও গ্রহণ করা যায় তা বিস্তারিত দেখানো হয়েছে।
1. Buffer কি?
Buffer হলো একটি এক্সটেনশন যেটি Node.js তে বাইনারি ডেটা প্রক্রিয়া করার জন্য ব্যবহৃত হয়। এটি মূলত মেমোরিতে বাইনারি ডেটা সঞ্চয় করতে সহায়তা করে, যা পরে ডিস্ট্রিবিউট বা প্রসেস করা যায়।
2. Socket.IO তে Binary Data ও Buffer ব্যবহার করে ফাইল পাঠানো
Socket.IO তে ফাইল পাঠাতে, সাধারণত binary data (যেমন একটি ছবি বা PDF ফাইল) Buffer হিসেবে পাঠানো হয়। Socket.IO দুইটি ফাংশন সরবরাহ করে, যা আপনার ফাইল বা বাইনারি ডেটা পাঠানোর জন্য কাজে আসে:
socket.emit()– ক্লায়েন্ট বা সার্ভার থেকে ডেটা পাঠানোর জন্য।socket.on()– ফাইল বা ডেটা গ্রহণ করার জন্য।
3. ফাইল পাঠানোর উদাহরণ
3.1 Server Side (Node.js)
ফাইল পাঠানো:
const http = require('http');
const socketIo = require('socket.io');
const fs = require('fs');
// HTTP সার্ভার তৈরি
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Socket.IO Server');
});
// Socket.IO সার্ভার তৈরি
const io = socketIo(server);
// ক্লায়েন্ট কানেক্ট হলে
io.on('connection', (socket) => {
console.log('A user connected');
// ফাইল পাঠানোর জন্য
socket.on('sendFile', (filePath) => {
console.log('Sending file:', filePath);
// ফাইল থেকে বাইনারি ডেটা নেওয়া
fs.readFile(filePath, (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
// বাইনারি ডেটা পাঠানো
socket.emit('receiveFile', data);
});
});
socket.on('disconnect', () => {
console.log('A user disconnected');
});
});
// সার্ভার 3000 পোর্টে চলবে
server.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});এখানে fs.readFile() ফাংশন ব্যবহার করে ফাইলের বাইনারি ডেটা Buffer আকারে পাঠানো হচ্ছে।
3.2 Client Side (HTML + JavaScript)
ফাইল গ্রহণ এবং ডিসপ্লে করা:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Socket.IO File Transfer</title>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<h1>Socket.IO File Transfer</h1>
<button onclick="requestFile()">Request File</button>
<h2>Received File:</h2>
<img id="fileDisplay" src="" alt="File will appear here"/>
<script>
var socket = io();
// ফাইল রিকোয়েস্ট পাঠানো
function requestFile() {
socket.emit('sendFile', 'path/to/your/file.jpg'); // ফাইল পাথ সার্ভারে পাঠানো
}
// ফাইল গ্রহণ করা এবং ডিসপ্লে করা
socket.on('receiveFile', (fileBuffer) => {
console.log('Received file data:', fileBuffer);
// Image element এ ফাইলটি ডিসপ্লে করা
var arrayBufferView = new Uint8Array(fileBuffer);
var blob = new Blob([arrayBufferView], {type: 'image/jpeg'});
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(blob);
document.getElementById('fileDisplay').src = imageUrl;
});
</script>
</body>
</html>এখানে, ক্লায়েন্ট socket.emit('sendFile') দিয়ে সার্ভারে ফাইল রিকোয়েস্ট পাঠাচ্ছে এবং সার্ভার socket.emit('receiveFile') দিয়ে ফাইলের বাইনারি ডেটা পাঠাচ্ছে। ক্লায়েন্ট এরপর Blob ব্যবহার করে এই বাইনারি ডেটাকে একটি ইমেজ হিসেবে প্রদর্শন করছে।
4. ফাইলের বড় সাইজ হ্যান্ডলিং
বড় সাইজের ফাইলের জন্য, Socket.IO তে buffer chunking বা streaming ব্যবহার করা উচিত। যদি আপনার ফাইল বড় হয়, তবে আপনি ফাইলকে ছোট ছোট অংশে (chunks) ভাগ করে পাঠাতে পারেন।
Chunked File Sending Example:
4.1 Server Side (Node.js with Chunking)
const CHUNK_SIZE = 1024 * 1024; // 1MB
socket.on('sendFile', (filePath) => {
const fileStats = fs.statSync(filePath);
const totalChunks = Math.ceil(fileStats.size / CHUNK_SIZE);
let currentChunk = 0;
// ফাইল পাঠানো chunk-wise
const stream = fs.createReadStream(filePath, { highWaterMark: CHUNK_SIZE });
stream.on('data', (chunk) => {
socket.emit('receiveFileChunk', { chunk, currentChunk, totalChunks });
currentChunk++;
});
stream.on('end', () => {
socket.emit('receiveFileComplete', 'File transfer complete');
});
});4.2 Client Side (Node.js with Chunking)
socket.on('receiveFileChunk', ({ chunk, currentChunk, totalChunks }) => {
console.log(`Received chunk ${currentChunk + 1} of ${totalChunks}`);
// File re-assembly can be done here if necessary
});
socket.on('receiveFileComplete', (message) => {
console.log(message); // "File transfer complete"
});এখানে highWaterMark এর মাধ্যমে আমরা ফাইলটিকে ছোট ছোট chunks এ ভাগ করে পাঠাচ্ছি, এবং ক্লায়েন্ট সেই chunks গ্রহণ করছে।
5. Error Handling
ফাইল পাঠানোর সময় কোনো ত্রুটি হলে তা হ্যান্ডেল করা জরুরি। আপনি try-catch ব্লক ব্যবহার করে এরকম ত্রুটি হ্যান্ডলিং করতে পারেন।
socket.on('sendFile', (filePath) => {
try {
fs.readFile(filePath, (err, data) => {
if (err) {
throw new Error('Error reading file');
}
socket.emit('receiveFile', data);
});
} catch (error) {
socket.emit('error', 'Failed to send file: ' + error.message);
}
});এখানে, readFile() এর মধ্যে ত্রুটি হলে সেটি ক্লায়েন্টকে জানানো হচ্ছে।
সারসংক্ষেপ
- Socket.IO তে binary data এবং Buffer ব্যবহার করে বড় ফাইল বা অন্যান্য বাইনারি ডেটা পাঠানো সম্ভব।
fs.readFile()ব্যবহার করে ফাইল থেকে বাইনারি ডেটা নেওয়া এবংsocket.emit()এর মাধ্যমে পাঠানো হয়।- Large file handling এর জন্য chunking বা streaming এর মাধ্যমে ফাইল ছোট ছোট অংশে পাঠানো হয়।
- Error handling এবং Buffer এর ব্যবহার ফাইল ট্রান্সফার প্রক্রিয়াকে আরো স্থিতিশীল ও নিরাপদ করে।
এইভাবে, আপনি Socket.IO ব্যবহার করে binary data এবং Buffer এর মাধ্যমে ফাইল পাঠাতে এবং গ্রহণ করতে পারেন।
Read more