সকেট বস্তু
সকেট ক্লাস একটি ডুপ্লেক্স স্ট্রিম যা নেটওয়ার্ক সংযোগ জুড়ে ডেটা পড়তে এবং লেখার অনুমতি দেয়। এটি Node.js এর নেট মডিউলে ক্লায়েন্ট এবং সার্ভার সংযোগের জন্য ব্যবহৃত হয়।
একটি সকেট একটি দূরবর্তী টার্মিনালে একটি TCP বা IPC সংযোগের প্রতিনিধিত্ব করে, সংযোগের জীবনচক্র এবং ডেটা স্থানান্তরের জন্য পদ্ধতি এবং ঘটনা প্রদান করে।
TCP এবং IPC সংযোগ
সকেট TCP এবং IPC উভয় সংযোগ সমর্থন করে
ডুপ্লেক্স স্ট্রীম
ডেটা একসাথে পড়া এবং লেখার অনুমতি দেয়
Client & Server
উভয় ক্লায়েন্ট এবং সার্ভার সংযোগের জন্য ব্যবহৃত
একটি নেট মডিউল আমদানি করা হচ্ছে
// নেট মডিউল আমদানি করুন const net = প্রয়োজন ('নেট'); // একটি সকেট তৈরি করুন const socket = new net.Socket();
সকেট বৈশিষ্ট্য
| বৈশিষ্ট্য | ব্যাখ্যা |
|---|---|
| socket.bufferSize | লিখিত বাফারে বাইটের সংখ্যা যা এখনও পাঠানো হয়নি |
| socket.bytesRead | সকেট দ্বারা প্রাপ্ত বাইট সংখ্যা |
| socket.bytesWritten | সকেট দ্বারা পাঠানো বাইট সংখ্যা |
| socket.connecting | একটি বুলিয়ান নির্দেশ করে যে সকেট সংযোগ করছে কিনা |
| socket.destroyed | একটি বুলিয়ান নির্দেশ করে যে সকেটটি ধ্বংস হয়েছে কিনা |
| socket.localAddress | সকেটের স্থানীয় আইপি ঠিকানা |
| socket.localPort | সকেটের স্থানীয় পোর্ট |
| socket.remoteAddress | দূরবর্তী সকেটের আইপি ঠিকানা |
| socket.remoteFamily | রিমোট সকেটের আইপি পরিবার (যেমন, 'IPv4' বা 'IPv6')। |
| socket.remotePort | দূরবর্তী সকেটের বন্দর |
সকেট পদ্ধতি
| পদ্ধতি | ব্যাখ্যা |
|---|---|
| socket.connect(options[, connectListener]) | একটি নির্দিষ্ট ঠিকানা এবং পোর্টের সাথে একটি সকেট সংযুক্ত করে। বিকল্পগুলির মধ্যে রয়েছে পোর্ট, হোস্ট, স্থানীয় ঠিকানা, স্থানীয় পোর্ট এবং আরও অনেক কিছু |
| socket.connect(path[, connectListener]) | নির্দিষ্ট IPC পাথের সাথে সকেটকে আবদ্ধ করে |
| socket.connect(port[, host][, connectListener]) | একটি নির্দিষ্ট পোর্ট এবং হোস্টের সাথে একটি সকেট সংযুক্ত করে |
| socket.destroy([error]) | সকেট ধ্বংস করে। যদি একটি ত্রুটি ফেরত দেওয়া হয়, এটি 'ত্রুটি' ইভেন্টে নির্গত হবে |
| socket.end([data][, encoding][, callback]) | ঐচ্ছিক ডেটা পাঠায় এবং সকেট বন্ধ করে, ইঙ্গিত করে যে আর কোনও ডেটা পাঠানো হবে না |
| socket.pause() | ডাটা রিডিং পজ করে, ইনকামিং ডেটাকে বাফার করার অনুমতি দেয় |
| socket.resume() | socket.pause() |
| socket.setEncoding([encoding]) | নির্দিষ্ট এনকোডিংয়ে ডেটা এনকোড করতে সকেট সেট করে (ডিফল্ট নাল, মানে বাফার অবজেক্ট ফেরত দেওয়া হয়) |
| socket.setKeepAlive([enable][, initialDelay]) | ঐচ্ছিক প্রাথমিক বিলম্ব মিলিসেকেন্ডে কিপ-অ্যালাইভ ফাংশনকে সক্ষম/অক্ষম করে |
| socket.setNoDelay([noDelay]) | Nagle এর অ্যালগরিদম সক্ষম/অক্ষম করে। সত্যে সেট করা হলে, বাফার না করেই ডাটা পাঠানো হয় |
| socket.setTimeout(timeout[, callback]) | সকেটের জন্য টাইমআউট সেট করে যেখানে 'টাইমআউট' ইভেন্টটি নির্গত হয় যখন কোনো কার্যকলাপ থাকে না |
| socket.write(data[, encoding][, callback]) | সকেটে ডেটা লেখে। ডেটা ফ্লাশ হলে সত্য বা বাফার হলে মিথ্যা দেখায় |
সকেট ঘটনা
| ঘটনা | ব্যাখ্যা |
|---|---|
| 'close' | সকেট সম্পূর্ণরূপে বন্ধ হয়ে গেলে মুক্তি। hadError আর্গুমেন্ট নির্দেশ করে যে কোনো ত্রুটির কারণে সকেটটি বন্ধ হয়েছে কিনা |
| 'connect' | একটি সকেট সংযোগ সফলভাবে প্রতিষ্ঠিত হলে ইস্যু করা হয় |
| 'data' | ডেটা প্রাপ্ত হলে প্রকাশ করা হয়। আর্গুমেন্ট প্রাপ্ত তথ্য (বাফার বা স্ট্রিং)। |
| 'drain' | লেখার বাফার খালি হলে নির্গত হয় |
| 'end' | যখন সকেটের অন্য প্রান্তটি স্থানান্তরের শেষ নির্দেশ করে তখন মুক্তি হয় |
| 'error' | কোনো ত্রুটি ঘটলে ইস্যু করা হয়। 'ক্লোজ' ইভেন্ট এই ইভেন্টের পরে সরাসরি গুলি করা হয় |
| 'lookup' | হোস্টনাম সমাধান হওয়ার পরে কিন্তু সংযোগ করার আগে ইস্যু করা হয়। লুকআপ সম্পর্কে বিশদ অন্তর্ভুক্ত |
| 'ready' | সকেট ব্যবহারের জন্য প্রস্তুত হলে মুক্তি |
| 'timeout' | কোন সকেট কার্যকলাপের কারণে টাইমআউট ঘটলে জারি করা হয়। এটি শুধুমাত্র একটি বিজ্ঞপ্তি - সকেট স্বয়ংক্রিয়ভাবে বন্ধ হবে না |
একটি TCP ক্লায়েন্ট তৈরি করা
এই উদাহরণটি একটি TCP ক্লায়েন্ট তৈরি দেখায় যা একটি সার্ভারের সাথে সংযোগ করে:
const net = প্রয়োজন ('নেট'); // একটি নতুন সকেট তৈরি করুন const ক্লায়েন্ট = new net.Socket(); // একটি সার্ভারের সাথে সংযোগ করুন client.connect(8080, '127.0.0.1', () => { console.log('সার্ভারের সাথে সংযুক্ত'); // সার্ভারে ডেটা পাঠাতে client.write('হ্যালো, সার্ভার! ক্লায়েন্ট থেকে।'); }); // সার্ভার থেকে প্রাপ্ত ডেটা পরিচালনা করতে client.on('data', (data) => { console.log(`সার্ভার থেকে প্রাপ্ত: ${data.toString()}`); // প্রতিক্রিয়া পাওয়ার পরে সংযোগটি বন্ধ করুন client.end(); }); // সংযোগ বন্ধ হ্যান্ডেল করতে client.on('close', () => { console.log('সংযোগ বন্ধ'); }); // ত্রুটিগুলি পরিচালনা করতে client.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); });
একটি TCP সার্ভার তৈরি করা
এই উদাহরণটি একটি TCP সার্ভার তৈরি করে যা সকেট সংযোগগুলি পরিচালনা করে:
const net = প্রয়োজন ('নেট'); // TCP সার্ভার তৈরি করুন const server = net.createServer((সকেট) => { // 'সকেট' একটি ক্লায়েন্ট সংযোগ - net.Socket এর একটি উদাহরণ console.log(`ক্লায়েন্ট সংযুক্ত: ${socket.remoteAddress}:${socket.remotePort}`); // এনকোডিং সেট করুন socket.setEncoding('utf8'); // ক্লায়েন্ট থেকে ডেটা পরিচালনা করতে socket.on('ডেটা', (ডেটা) => { console.log(`ক্লায়েন্ট থেকে প্রাপ্ত: ${data}`); // ক্লায়েন্টের কাছে ডেটা ইকো করুন socket.write(`আপনি বলেছেন: ${data}`); }); // ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হ্যান্ডেল socket.on('শেষ', () => { console.log('ক্লায়েন্ট সংযোগ বিচ্ছিন্ন'); }); // সকেট ত্রুটিগুলি পরিচালনা করুন socket.on('error', (err) => { console.error(`সকেট ত্রুটি: ${err.message}`); }); // ক্লায়েন্টকে একটি স্বাগত বার্তা পাঠাতে socket.write('TCP সার্ভারে স্বাগতম!\n'); }); // পোর্ট 8080 এ সার্ভার শুরু করুন server.listen(8080, '127.0.0.1', () => { console.log('পোর্ট 8080 এ সার্ভার শুনছে'); }); // সার্ভারের ত্রুটিগুলি পরিচালনা করুন server.on('error', (err) => { console.error(`সার্ভার ত্রুটি: ${err.message}`); });
Socket Timeout
এই উদাহরণটি দেখায় কিভাবে সকেট টাইমআউট সেট এবং পরিচালনা করতে হয়:
const net = প্রয়োজন ('নেট'); // টাইমআউট সহ সার্ভার তৈরি করুন const server = net.createServer((সকেট) => { console.log('ক্লায়েন্ট সংযুক্ত'); // সকেট টাইমআউট 10 সেকেন্ডে সেট করুন socket.setTimeout(10000); // সকেট টাইমআউট পরিচালনা করতে socket.on('টাইমআউট', () => { console.log('সকেট টাইমআউট - 10 সেকেন্ডের জন্য কোনো কার্যকলাপ নেই'); socket.write('আপনি অনেক দিন ধরে নিষ্ক্রিয় ছিলেন। সংযোগ বন্ধ হয়ে যাবে।'); socket.end(); }); // ডেটা ম্যানিপুলেট করতে socket.on('ডেটা', (ডেটা) => { console.log(`প্রাপ্ত হয়েছে: ${data.toString()}`); socket.write('ডেটা গৃহীত'); // টাইমআউট প্রতিবার ডেটা প্রাপ্তির সময় পুনরায় সেট করা হয় console.log('টাইমআউট টাইমার রিসেট'); }); // সকেট বন্ধ হ্যান্ডেল socket.on('close', () => { console.log('সকেট বন্ধ'); }); // স্বাগত বার্তা পাঠান socket.write('স্বাগতম! এই সংযোগটি 10 সেকেন্ড নিষ্ক্রিয়তার পরে সময় শেষ হয়ে যাবে।\n'); }); // সার্ভার শুরু করুন const PORT = 8081; server.listen(PORT, () => { console.log(`${PORT}` পোর্টে চলমান টাইমআউট উদাহরণ সার্ভার); // পরীক্ষার জন্য: একটি ক্লায়েন্ট তৈরি করুন যা সংযোগ করে কিন্তু ডেটা পাঠায় না const ক্লায়েন্ট = new net.Socket(); client.connect(PORT, '127.0.0.1', () => { console.log('টেস্ট ক্লায়েন্ট সংযুক্ত'); // 5 সেকেন্ড পরে একটি বার্তা পাঠান (সময় শেষ হওয়ার আগে) setTimeout(() => { client.write('হ্যালো 5 সেকেন্ড পর'); }, 5000); // আমরা অন্য কিছু পাঠাব না, তাই সংযোগের সময়সীমা শেষ হওয়া উচিত // আরও 10 সেকেন্ড পরে }); client.on('data', (data) => { console.log(`ক্লায়েন্ট প্রাপ্ত হয়েছে: ${data.toString()}`); }); client.on('close', () => { console.log('ক্লায়েন্ট সংযোগ বিচ্ছিন্ন'); }); });
সকেট বিকল্প
এই উদাহরণটি দেখায় কিভাবে বিভিন্ন সকেট বিকল্পগুলি কনফিগার করতে হয়:
const net = প্রয়োজন ('নেট'); // বিকল্পগুলির সাথে সকেট তৈরি করুন const socket = new net.Socket(); // সকেট বিকল্পগুলি কনফিগার করুন socket.setKeepAlive(সত্য, 1000); // 1 সেকেন্ড প্রারম্ভিক বিলম্বের সাথে কিপ-লাইভ সক্ষম করুন socket.setNoDelay(সত্য); // Nagle এর অ্যালগরিদম অক্ষম করুন (কোন বাফারিং নেই) // একটি সার্ভারের সাথে সংযোগ করুন socket.connect({ পোর্ট: 80, হোস্ট: 'example.com', পরিবার: 4, // IPv4 localAddress: '0.0.0.0', // আবদ্ধ করার জন্য স্থানীয় ইন্টারফেস localPort: 8000 // আবদ্ধ করতে স্থানীয় পোর্ট }, () => { console.log('অপশনের সাথে সংযুক্ত'); // সকেট তথ্য প্রদর্শন করুন console.log(`স্থানীয় ঠিকানা: ${socket.localAddress}:${socket.localPort}`); console.log(`দূরবর্তী ঠিকানা: ${socket.remoteAddress}:${socket.remotePort}`); console.log(`রিমোট ফ্যামিলি: ${socket.remoteFamily}`); // একটি সাধারণ HTTP অনুরোধ পাঠাতে socket.write('GET/HTTP/1.1\r\n'); socket.write('হোস্ট: example.com\r\n'); socket.write('সংযোগ: বন্ধ\r\n'); socket.write('\r\n'); }); // ডেটা ম্যানিপুলেট করতে let responseData = ''; socket.on('ডেটা', (ডেটা) => { const chunk = data.toString(); প্রতিক্রিয়া ডেটা += খণ্ড; // প্রতিক্রিয়ার প্রথম লাইন প্রদর্শন করুন যদি (responseData.includes('\r\n') && !socket.firstLineShown) { const firstLine = responseData.split('\r\n')[0]; console.log(`প্রতিক্রিয়ার প্রথম লাইন: ${firstLine}`); socket.firstLineShown = সত্য; } }); // ডেটা ফলাফল পরিচালনা করতে socket.on('শেষ', () => { console.log('প্রতিক্রিয়া সম্পূর্ণ'); console.log(`মোট বাইট প্রাপ্ত: ${socket.bytesRead}`); console.log(`মোট বাইট পাঠানো হয়েছে: ${socket.bytesWritten}`); }); // ত্রুটিগুলি পরিচালনা করতে socket.on('error', (err) => { console.error(`সকেট ত্রুটি: ${err.message}`); });
সকেট বাফারের সাথে কাজ করা
এই উদাহরণটি সকেট বাফারিং এবং 'ড্রেন' ইভেন্ট প্রদর্শন করে:
const net = প্রয়োজন ('নেট'); // বাফার ম্যানিপুলেশন প্রদর্শন করতে সার্ভার তৈরি করুন const server = net.createServer((সকেট) => { console.log('ক্লায়েন্ট সংযুক্ত'); // দ্রুত ভরাট প্রদর্শন করতে বাফার ছোট করুন socket.bufferSize = 1024; // দ্রষ্টব্য: এটি আসলে বাফার আকার সীমাবদ্ধ করে না // ক্লায়েন্টকে একটি ধীর প্রতিক্রিয়া পাঠিয়ে বাফারিং প্রদর্শন করতে socket.on('ডেটা', (ডেটা) => { console.log(`প্রাপ্ত ডেটা: ${data.toString().trim()}`); console.log('বড় প্রতিক্রিয়া পাঠানো হচ্ছে...'); // বাফার পূর্ণ না হওয়া পর্যন্ত ডেটা লেখার ফাংশন const writeUntilBufferFull = () => { // পাঠাতে কিছু ডেটা তৈরি করুন const chunk = 'x'.repeat(1024); // বাফার পূর্ণ না হওয়া পর্যন্ত লেখা চালিয়ে যান (লিখতে মিথ্যা রিটার্ন) let i = 0; যখন (আমি <100) { const canContinue = socket.write(`Chunk ${i}: ${chunk}\n`); console.log(`লিখেছেন খণ্ড ${i}, বাফার পূর্ণ? ${!canContinue}`); // বাফার পূর্ণ হলে, এটি নিষ্কাশনের জন্য অপেক্ষা করুন যদি (!চালিয়ে যেতে পারেন) { console.log(${i} লেখার পরে `বাফার পূর্ণ। বর্তমান বাফার আকার: ${socket.bufferSize} বাইট`); // লেখা বন্ধ করুন এবং 'ড্রেন' ইভেন্টের জন্য অপেক্ষা করুন socket.once('ড্রেন', () => { console.log('বাফার ড্রেনড, রিজুমিং রাইটিং'); writeUntilBufferFull(); }); প্রত্যাবর্তন } i++; } // সব খণ্ড লেখা হয় console.log('সমস্ত ডেটা পাঠানো'); socket.end('\nট্রান্সমিশন সম্পূর্ণ'); }; // লেখার প্রক্রিয়া শুরু করুন writeUntilBufferFull(); }); socket.on('শেষ', () => { console.log('ক্লায়েন্ট সংযোগ বিচ্ছিন্ন'); }); socket.on('error', (err) => { console.error(`সকেট ত্রুটি: ${err.message}`); }); socket.write('বড় প্রতিক্রিয়া পেতে যেকোনো বার্তা পাঠান\n'); }); // সার্ভার শুরু করুন const PORT = 8082; server.listen(PORT, () => { console.log(`${PORT}` পোর্টে চলমান বাফার প্রদর্শন সার্ভার); // প্রুফিংয়ের জন্য, একটি ক্লায়েন্ট তৈরি করুন যা একসাথে বার্তা পাঠায় const ক্লায়েন্ট = new net.Socket(); client.connect(PORT, '127.0.0.1', () => { console.log('টেস্ট ক্লায়েন্ট সংযুক্ত'); // 1 সেকেন্ড পরে বার্তা পাঠান setTimeout(() => { client.write('দয়া করে আমাকে একটি বড় প্রতিক্রিয়া পাঠান'); }, 1000); }); চলুন প্রাপ্ত ডেটা = 0; client.on('data', (data) => { প্রাপ্ত ডেটা += data.length; console.log(`ক্লায়েন্ট ${data.length} বাইট পেয়েছে, মোট: ${receivedData}`); }); client.on('end', () => { console.log(${receivedData} বাইট পাওয়ার পর ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হয়ে গেছে"); process.exit(0); }); client.on('error', (err) => { console.error(`ক্লায়েন্ট ত্রুটি: ${err.message}`); }); });
আইপিসি সকেট যোগাযোগ
এই উদাহরণটি ইউনিক্স ডোমেইন সকেট ব্যবহার করে ইন্টার-প্রসেস কমিউনিকেশন (আইপিসি) প্রদর্শন করে:
const net = প্রয়োজন ('নেট'); const path = require('path'); const fs = প্রয়োজন('fs'); // IPC পাথ - OS এর উপর নির্ভর করে const socketPath = process.platform === 'win32' ? path.join('\\\\?\\pipe', process.cwd(), 'ipc-demo.sock') : path.join(process.cwd(), 'ipc-demo.sock'); // বিদ্যমান সকেট ফাইল সরান (শুধুমাত্র ইউনিক্স) যদি (process.platform !== 'win32' && fs.existsSync(socketPath)) { fs.unlinkSync(সকেটপাথ); } // IPC সার্ভার তৈরি করুন const server = net.createServer((সকেট) => { console.log('ক্লায়েন্ট আইপিসি সকেটের সাথে সংযুক্ত'); socket.on('ডেটা', (ডেটা) => { const বার্তা = data.toString().trim(); console.log(`সার্ভার প্রাপ্ত হয়েছে: ${message}`); // ইকো ব্যাক socket.write(`Echo: ${message}`); }); socket.on('শেষ', () => { console.log('ক্লায়েন্ট IPC সকেট থেকে সংযোগ বিচ্ছিন্ন'); }); socket.write('IPC সার্ভারের সাথে সংযুক্ত\n'); }); // সার্ভারের ত্রুটিগুলি পরিচালনা করুন server.on('error', (err) => { console.error(`IPC সার্ভার ত্রুটি: ${err.message}`); }); // IPC সার্ভার শুরু করুন server.listen(socketPath, () => { console.log(${socketPath}`-এ $IPC সার্ভার শুনছে); // একটি ক্লায়েন্ট তৈরি করুন যা IPC সকেটের সাথে সংযোগ করে const ক্লায়েন্ট = new net.Socket(); client.on('data', (data) => { console.log(`ক্লায়েন্ট প্রাপ্ত হয়েছে: ${data.toString().trim()}`); }); client.on('end', () => { console.log('IPC সার্ভার থেকে সংযোগ বিচ্ছিন্ন'); }); client.on('error', (err) => { console.error(`IPC ক্লায়েন্ট ত্রুটি: ${err.message}`); }); // IPC সার্ভারের সাথে সংযোগ করুন client.connect(socketPath, () => { console.log('IPC সার্ভারের সাথে সংযুক্ত'); client.write('Hello via IPC সকেট'); // একাধিক বার্তা পাঠান setTimeout(() => { client.write('বার্তা 1'); }, 1000); setTimeout(() => { client.write('মেসেজ 2'); client.end(); // শেষ বার্তা পাঠানোর পরে বন্ধ করুন }, 2000); }); }); // প্রস্থান করার সময় পরিষ্কার করা process.on('প্রস্থান', () => { যদি (process.platform !== 'win32' && fs.existsSync(socketPath)) { fs.unlinkSync(সকেটপাথ); } }); // Ctrl+C পরিচালনা করতে process.on('SIGINT', () => { console.log('শাট ডাউন...'); process.exit(0); });
Half-Closed Sockets
এই উদাহরণটি অর্ধ-বন্ধ সংযোগগুলি প্রদর্শন করে, যেখানে একটি পৃষ্ঠা তাদের লেখার স্ট্রিম শেষ করেছে এবং এখনও ডেটা গ্রহণ করতে পারে:
const net = প্রয়োজন ('নেট'); // সার্ভার তৈরি করুন const server = net.createServer((সকেট) => { console.log('ক্লায়েন্ট সংযুক্ত'); // প্রাথমিক বার্তা পাঠান socket.write('অর্ধ-ক্লোজ ডেমোনস্ট্রেশন সার্ভারে স্বাগতম\n'); // ক্লায়েন্ট থেকে ডেটা পরিচালনা করতে socket.on('ডেটা', (ডেটা) => { console.log(`সার্ভার প্রাপ্ত হয়েছে: ${data.toString().trim()}`); }); // সকেট শেষ (ক্লায়েন্ট তাদের লেখার স্ট্রিম শেষ করেছে) socket.on('শেষ', () => { console.log('ক্লায়েন্ট তাদের লেখার প্রবাহ শেষ করেছে (অর্ধ-বন্ধ)'); // তারা তাদের লেখার স্ট্রীম শেষ করার পরেও ক্লায়েন্টকে লিখতে পারে socket.write('আপনি আপনার সংযোগের দিকটি শেষ করেছেন, কিন্তু আমি এখনও আপনার সাথে কথা বলতে পারি।'); // বিলম্বের পরে আমাদের পেজ বন্ধ করুন setTimeout(() => { console.log('সার্ভার এখন তার লেখার প্রবাহ বন্ধ করছে'); socket.end('বিদায়! আমার সংযোগের দিকটি এখন বন্ধ করছি।'); }, 8080); }); // সম্পূর্ণ সকেট বন্ধ হ্যান্ডেল করতে socket.on('close', (hadError) => { console.log(`সকেট সম্পূর্ণরূপে বন্ধ। ত্রুটি ছিল: ${hadError}`); }); socket.on('error', (err) => { console.error(`সকেট ত্রুটি: ${err.message}`); }); }); // সার্ভার শুরু করুন const PORT = 8083; server.listen(PORT, () => { console.log(`${PORT}` পোর্টে চলমান হাফ-ক্লোজ ডেমোনস্ট্রেশন সার্ভার); // প্রদর্শনের জন্য ক্লায়েন্ট তৈরি করুন const ক্লায়েন্ট = new net.Socket(); client.connect(PORT, '127.0.0.1', () => { console.log('ক্লায়েন্ট সংযুক্ত'); // কিছু ডেটা পাঠান client.write('ক্লায়েন্ট থেকে হ্যালো'); // বিলম্বের পরে অর্ধ-বন্ধ ক্লায়েন্ট লিখুন স্ট্রিম setTimeout(() => { console.log('ক্লায়েন্ট তার লেখার স্ট্রিম শেষ করছে (অর্ধ-বন্ধ)'); client.end(); // আর লিখতে পারে না, তবে এখনও ডেটা গ্রহণ করতে পারে console.log('ক্লায়েন্ট আরও ডেটা পাওয়ার জন্য অপেক্ষা করছে...'); }, 2000); }); // সার্ভার থেকে ডেটা পরিচালনা করতে client.on('data', (data) => { console.log(`ক্লায়েন্ট প্রাপ্ত হয়েছে: ${data.toString().trim()}`); }); // তাদের লেখার স্ট্রীম বন্ধ সার্ভার পরিচালনা করতে client.on('end', () => { console.log('সার্ভার তার লেখার প্রবাহ শেষ করেছে, সংযোগ সম্পূর্ণরূপে বন্ধ'); }); // সম্পূর্ণ সংযোগ বন্ধ হ্যান্ডেল করতে client.on('close', (hadError) => { console.log(`ক্লায়েন্ট সংযোগ সম্পূর্ণরূপে বন্ধ। ত্রুটি ছিল: ${hadError}`); }); client.on('error', (err) => { console.error(`ক্লায়েন্ট ত্রুটি: ${err.message}`); }); });
সকেট প্রোগ্রামিংয়ের জন্য সর্বোত্তম অনুশীলন
Node.js Sockets , :