Node.js Net Module

Node.js TCP

নেট মডিউলের পরিচিতি

নেট মডিউল হল Node.js এর মূল নেটওয়ার্কিং মডিউলগুলির মধ্যে একটি যা আপনাকে TCP সার্ভার এবং ক্লায়েন্ট তৈরি করতে দেয়। TCP (ট্রান্সমিশন কন্ট্রোল প্রোটোকল) নেটওয়ার্ক ডিভাইসে চলমান অ্যাপ্লিকেশনগুলির মধ্যে বাইটের একটি স্ট্রিমের একটি নির্ভরযোগ্য, অর্ডার করা এবং ত্রুটি-চেক করা ডেলিভারি।

নেট মডিউলের উপরে নির্মিত HTTP মডিউলের পরিবর্তে, নেট মডিউল নিম্ন-স্তরের নেটওয়ার্কিং ক্ষমতা প্রদান করে যা যোগাযোগ প্রোটোকলের উপর আরো নিয়ন্ত্রণ প্রদান করে।

📝দ্রষ্টব্য:

নেট মডিউল এমন পরিস্থিতিতে সবচেয়ে উপযুক্ত যেখানে একটি কাস্টম TCP প্রোটোকল প্রয়োজন হয় বা আপনি যখন TCP-এর উপরে আপনার নিজস্ব অ্যাপ্লিকেশন-স্তরের প্রোটোকল প্রয়োগ করতে চান।

একটি নেট মডিউল আমদানি করা হচ্ছে

নেট মডিউল, প্রয়োজন() পদ্ধতি ব্যবহার করে আপনার Node.js অ্যাপ্লিকেশনে যোগ করুন:

const net = require('net');

একটি TCP সার্ভার তৈরি করা

নেট মডিউল একটি টিসিপি সার্ভার তৈরি করা সহজ করে যা সংযোগের জন্য শোনে:

const net = require('net');

// Create a TCP server
const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // Set encoding to utf8 so we receive strings instead of Buffer objects
  socket.setEncoding('utf8');
  
  // Handle data from client
  socket.on('data', (data) => {
    console.log(`Received from client: ${data}`);
    
    // Echo the data back to the client
    socket.write(`Echo: ${data}`);
  });
  
  // Handle client disconnection
  socket.on('end', () => {
    console.log('Client disconnected');
  });
  
  // Handle errors
  socket.on('error', (err) => {
    console.error('Socket error:', err);
  });
  
  // Send a welcome message to the client
  socket.write('Welcome to the TCP server!\r\n');
});

// Start the server and listen on port 8080
server.listen(8080, () => {
  console.log('TCP Server running on port 8080');
});

এই উদাহরণে:

net.createServer()- একটি নতুন TCP সার্ভার তৈরি করে
কলব্যাক ফাংশন- ক্লায়েন্ট সংযোগ করলে কল করা হয়
সকেট বস্তু- ক্লায়েন্টের সাথে সংযোগের প্রতিনিধিত্ব করে
ইভেন্ট হ্যান্ডলার- ডেটা, ফলাফল এবং ত্রুটি ইভেন্টের জন্য সেট করুন
server.listen(8080)- পোর্ট 8080 এ সার্ভার শুরু করে

একটি TCP ক্লায়েন্ট তৈরি করা হচ্ছে

আপনি একটি TCP সার্ভারের সাথে একটি ইন্টারনেট TCP ক্লায়েন্টও তৈরি করতে পারেন:

const net = require('net');

// Create a TCP client
const client = net.createConnection({ port: 8080 }, () => {
  console.log('Connected to server');
  
  // Send a message to the server
  client.write('Hello from client!');
});

// Set encoding
client.setEncoding('utf8');

// Handle data from server
client.on('data', (data) => {
  console.log(`Received from server: ${data}`);
  
  // Send another message
  client.write('More data from client');
});

// Handle connection end
client.on('end', () => {
  console.log('Disconnected from server');
});

// Handle errors
client.on('error', (err) => {
  console.error('Connection error:', err);
});

এই উদাহরণে:

net.createConnection()- ক্লায়েন্ট সার্ভারের সাথে একটি TCP সংযোগ স্থাপন করে
পোর্ট এবং হোস্ট- আমরা সংযোগ করার জন্য পোর্ট (এবং ঐচ্ছিকভাবে হোস্ট) প্রদান করি
কলব্যাক ফাংশন- একটি সংযোগ স্থাপন করা হলে কল করা হয়
ইভেন্ট হ্যান্ডলার- ডেটা, ফলাফল এবং ত্রুটি ইভেন্টের জন্য সেট করুন

🔧পরীক্ষা নোট:

ক্লায়েন্ট এবং সার্ভার একসাথে পরীক্ষা করতে, একটি টার্মিনালে সার্ভার স্ক্রিপ্ট এবং অন্য টার্মিনালে ক্লায়েন্ট স্ক্রিপ্ট চালান।

সকেট বৈশিষ্ট্য এবং পদ্ধতি

সকেট অবজেক্ট সার্ভার কানেকশন কলব্যাকে প্রদত্ত এবং createConnection() দ্বারা প্রত্যাবর্তিত হয় এর বেশ কিছু দরকারী বৈশিষ্ট্য এবং পদ্ধতি রয়েছে:

বৈশিষ্ট্য/পদ্ধতি ব্যাখ্যা
socket.write(data[, encoding][, callback]) ঐচ্ছিকভাবে নির্দিষ্ট এনকোডিং সহ সকেটে ডেটা লেখে
socket.end([data][, encoding][, callback]) সমস্ত ডেটা লেখা এবং ফ্লাশ করার পরে সকেট বন্ধ করে
socket.setEncoding(encoding) সকেটে প্রাপ্ত ডেটার জন্য এনকোডিং সেট করে
socket.setTimeout(timeout[, callback]) নির্দিষ্ট মিলিসেকেন্ড নিষ্ক্রিয়তার পরে সকেটকে টাইমআউটে সেট করে
socket.setKeepAlive([enable][, initialDelay]) কিপ-অসিলেশন ফাংশন সক্রিয়/অক্ষম করে
socket.address() ঠিকানা, পরিবার এবং সংযোগের পোর্ট সহ একটি বস্তু প্রদান করে
socket.remoteAddress একটি স্ট্রিং হিসাবে দূরবর্তী আইপি ঠিকানা
socket.remotePort দূরবর্তী পোর্ট একটি সংখ্যা
socket.localAddress স্থানীয় IP ঠিকানা সার্ভার শোনে
socket.localPort স্থানীয় পোর্ট যেখানে সার্ভার শোনে
socket.bytesRead প্রাপ্ত বাইট সংখ্যা
socket.bytesWritten পাঠানো বাইট সংখ্যা

সার্ভারের বৈশিষ্ট্য এবং পদ্ধতি

createServer() দ্বারা প্রত্যাবর্তিত সার্ভার অবজেক্টের এই দরকারী বৈশিষ্ট্য এবং পদ্ধতি রয়েছে:

বৈশিষ্ট্য/পদ্ধতি ব্যাখ্যা
server.listen(port[, hostname][, backlog][, callback]) সংযোগের জন্য শোনার জন্য সার্ভার শুরু করে
server.close([callback]) সার্ভারকে নতুন সংযোগ গ্রহণ করা বন্ধ করে
server.address() সার্ভারের ঠিকানা তথ্য সহ একটি বস্তু প্রদান করে
server.maxConnections সংযোগের সংখ্যা বাড়লে সংযোগ প্রত্যাখ্যান করার জন্য এই বৈশিষ্ট্যটি সেট করুন
server.connections যুগপত সংযোগের সংখ্যা
server.listening সার্ভার শুনছে কিনা তা নির্দেশ করে বুলিয়ান

একটি চ্যাট সার্ভার তৈরি করা হচ্ছে

আসুন একটি সাধারণ চ্যাট সার্ভার তৈরি করি যা সমস্ত সংযুক্ত ক্লায়েন্টদের কাছে বার্তা সম্প্রচার করে:

const net = require('net');

// Store all client connections
const clients = [];

// Create a chat server
const server = net.createServer((socket) => {
  // Generate a client ID
  const clientId = `${socket.remoteAddress}:${socket.remotePort}`;
  console.log(`Client connected: ${clientId}`);
  
  // Set encoding
  socket.setEncoding('utf8');
  
  // Add client to the list
  clients.push(socket);
  
  // Send welcome message
  socket.write(`Welcome to the chat server! There are ${clients.length} users online.\r\n`);
  
  // Broadcast message to all clients except the sender
  function broadcast(message, sender) {
    clients.forEach(client => {
      if (client !== sender) {
        client.write(message);
      }
    });
  }
  
  // Notify all clients about the new connection
  broadcast(`User ${clientId} joined the chat.\r\n`, socket);
  
  // Handle client messages
  socket.on('data', (data) => {
    console.log(`${clientId}: ${data.trim()}`);
    
    // Broadcast the message to all other clients
    broadcast(`${clientId}: ${data}`, socket);
  });
  
  // Handle client disconnection
  socket.on('end', () => {
    console.log(`Client disconnected: ${clientId}`);
    
    // Remove client from the list
    const index = clients.indexOf(socket);
    if (index !== -1) {
      clients.splice(index, 1);
    }
    
    // Notify all clients about the disconnection
    broadcast(`User ${clientId} left the chat.\r\n`, null);
  });
  
  // Handle errors
  socket.on('error', (err) => {
    console.error(`Socket error from ${clientId}:`, err);
  });
});

// Start the server
const PORT = 8080;
server.listen(PORT, () => {
  console.log(`Chat server running on port ${PORT}`);
});

// Handle server errors
server.on('error', (err) => {
  console.error('Server error:', err);
});

এই চ্যাট সার্ভারের সাথে সংযোগ করতে, আপনি একটি TCP ক্লায়েন্ট বা একটি টার্মিনাল টুল যেমন টেলনেট ব্যবহার করতে পারেন:

telnet localhost 8080

আপনি নেট মডিউল ব্যবহার করে একটি ডেডিকেটেড চ্যাট ক্লায়েন্টও তৈরি করতে পারেন:

const net = require('net');
const readline = require('readline');

// Create interface for reading from the terminal
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// Create a client connection
const client = net.createConnection({ port: 8080 }, () => {
  console.log('Connected to chat server');
  console.log('Type a message and press Enter to send');
  
  // Start reading user input
  rl.prompt();
});

// Set encoding
client.setEncoding('utf8');

// Handle data from server
client.on('data', (data) => {
  // Move cursor to beginning of line and clear it
  process.stdout.write('\r\x1b[K');
  
  // Print the server message
  console.log(data.trim());
  
  // Re-display the prompt
  rl.prompt();
});

// Handle connection end
client.on('end', () => {
  console.log('Disconnected from server');
  rl.close();
  process.exit(0);
});

// Handle errors
client.on('error', (err) => {
  console.error('Connection error:', err);
  rl.close();
  process.exit(1);
});

// Handle user input
rl.on('line', (input) => {
  // Send the user input to the server
  client.write(input);
  rl.prompt();
});

// Close the connection when the user exits
rl.on('close', () => {
  console.log('Exiting chat...');
  client.end();
});

একটি সাধারণ প্রোটোকল তৈরি করা

NET মডিউল হল আপনার নিজস্ব অ্যাপ্লিকেশন প্রোটোকল তৈরি করার ক্ষমতা। আসুন একটি সাধারণ JSON-ভিত্তিক প্রোটোকল তৈরি করি:

const net = require('net');

// Create a server that supports a JSON-based protocol
const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // Buffer for incoming data
  let buffer = '';
  
  // Handle data
  socket.on('data', (data) => {
    // Add the new data to our buffer
    buffer += data.toString();
    
    // Process complete messages
    let boundary = buffer.indexOf('\n');
    while (boundary !== -1) {
      // Extract the complete message
      const message = buffer.substring(0, boundary);
      buffer = buffer.substring(boundary + 1);
      
      // Process the message
      try {
        const parsedMessage = JSON.parse(message);
        console.log('Received message:', parsedMessage);
        
        // Handle different message types
        switch (parsedMessage.type) {
          case 'greeting':
            socket.write(JSON.stringify({
              type: 'welcome',
              message: `Hello, ${parsedMessage.name}!`,
              timestamp: Date.now()
            }) + '\n');
            break;
            
          case 'query':
            socket.write(JSON.stringify({
              type: 'response',
              queryId: parsedMessage.queryId,
              result: handleQuery(parsedMessage.query),
              timestamp: Date.now()
            }) + '\n');
            break;
            
          default:
            socket.write(JSON.stringify({
              type: 'error',
              message: 'Unknown message type',
              timestamp: Date.now()
            }) + '\n');
        }
      } catch (err) {
        console.error('Error processing message:', err);
        socket.write(JSON.stringify({
          type: 'error',
          message: 'Invalid JSON format',
          timestamp: Date.now()
        }) + '\n');
      }
      
      // Look for the next message
      boundary = buffer.indexOf('\n');
    }
  });
  
  // Handle disconnection
  socket.on('end', () => {
    console.log('Client disconnected');
  });
  
  // Handle errors
  socket.on('error', (err) => {
    console.error('Socket error:', err);
  });
});

// Simple function to handle queries
function handleQuery(query) {
  if (query === 'time') {
    return { time: new Date().toISOString() };
  } else if (query === 'stats') {
    return {
      uptime: process.uptime(),
      memory: process.memoryUsage(),
      platform: process.platform
    };
  } else {
    return { error: 'Unknown query' };
  }
}

// Start the server
const PORT = 8080;
server.listen(PORT, () => {
  console.log(`JSON protocol server running on port ${PORT}`);
});

এখানে একটি ক্লায়েন্ট এই প্রোটোকল ব্যবহার করে:

const net = require('net');

// Connect to the server
const client = net.createConnection({ port: 8080 }, () => {
  console.log('Connected to server');
  
  // Send a greeting
  send({
    type: 'greeting',
    name: 'Client'
  });
  
  // Send a query
  send({
    type: 'query',
    queryId: 1,
    query: 'time'
  });
  
  // Send another query
  setTimeout(() => {
    send({
      type: 'query',
      queryId: 2,
      query: 'stats'
    });
  }, 1000);
});

// Buffer for incoming data
let buffer = '';

// Handle data from server
client.on('data', (data) => {
  // Add the new data to our buffer
  buffer += data.toString();
  
  // Process complete messages
  let boundary = buffer.indexOf('\n');
  while (boundary !== -1) {
    // Extract the complete message
    const message = buffer.substring(0, boundary);
    buffer = buffer.substring(boundary + 1);
    
    // Process the message
    try {
      const parsedMessage = JSON.parse(message);
      console.log('Received from server:', parsedMessage);
    } catch (err) {
      console.error('Error parsing message:', err);
    }
    
    // Look for the next message
    boundary = buffer.indexOf('\n');
  }
});

// Helper function to send messages
function send(message) {
  const jsonString = JSON.stringify(message) + '\n';
  console.log('Sending:', message);
  client.write(jsonString);
}

// Handle connection end
client.on('end', () => {
  console.log('Disconnected from server');
});

// Handle errors
client.on('error', (err) => {
  console.error('Connection error:', err);
});

// Close the connection after some time
setTimeout(() => {
  console.log('Closing connection');
  client.end();
}, 5000);

ℹ️নৈতিক নোট:

এই প্রোটোকলে, আমরা বার্তা ধারাবাহিকতার জন্য JSON ব্যবহার করি এবং বার্তার সীমানাগুলির জন্য নতুন লাইন অক্ষর (\n) ব্যবহার করি। এটি বার্তাগুলিকে পার্স করা সহজ করে তোলে এবং বিভিন্ন ধরণের বার্তা এবং পেলোডের জন্য অনুমতি দেয়৷

সকেট টাইমআউট

নিষ্ক্রিয় সংযোগগুলি পরিচালনা করতে, আপনি সকেটে একটি সময়সীমা সেট করতে পারেন:

const net = require('net');

const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // Set a timeout of 10 seconds
  socket.setTimeout(10000);
  
  // Handle timeout
  socket.on('timeout', () => {
    console.log('Socket timeout');
    socket.write('You have been inactive for too long. Disconnecting...\r\n');
    socket.end();
  });
  
  // Handle data
  socket.on('data', (data) => {
    console.log(`Received: ${data.toString().trim()}`);
    socket.write(`Echo: ${data}`);
  });
  
  // Handle disconnection
  socket.on('end', () => {
    console.log('Client disconnected');
  });
});

server.listen(8080, () => {
  console.log('Server with timeout running on port 8080');
});

আইপিসি (আন্তঃপ্রক্রিয়া যোগাযোগ) এর সাথে কাজ করা

নেট মডিউল উইন্ডোজে ইউনিক্স ডোমেইন সকেট বা নামযুক্ত পাইপ ব্যবহার করে IPC (আন্তঃ-প্রক্রিয়া যোগাযোগ) সার্ভার এবং ক্লায়েন্ট তৈরি করতে পারে:

const net = require('net');
const path = require('path');

// Define the path for the IPC socket
const socketPath = path.join(__dirname, 'ipc-socket');

// Create an IPC server
const server = net.createServer((socket) => {
  console.log('Client connected to IPC server');
  
  socket.on('data', (data) => {
    console.log(`Received via IPC: ${data.toString().trim()}`);
    socket.write(`Echo: ${data}`);
  });
  
  socket.on('end', () => {
    console.log('Client disconnected from IPC server');
  });
});

// Start the IPC server
server.listen(socketPath, () => {
  console.log(`IPC server running at ${socketPath}`);
});

// Clean up the socket file when the server closes
server.on('close', () => {
  console.log('Cleaning up socket file');
  require('fs').unlinkSync(socketPath);
});

// Handle process termination
process.on('SIGINT', () => {
  server.close(() => {
    console.log('IPC server closed');
    process.exit(0);
  });
});

এবং এখানে একটি আইপিসি ক্লায়েন্ট:

const net = require('net');
const path = require('path');

// Define the path for the IPC socket
const socketPath = path.join(__dirname, 'ipc-socket');

// Create an IPC client
const client = net.createConnection({ path: socketPath }, () => {
  console.log('Connected to IPC server');
  client.write('Hello from IPC client!');
});

client.on('data', (data) => {
  console.log(`Received from IPC server: ${data.toString().trim()}`);
  client.end();
});

client.on('end', () => {
  console.log('Disconnected from IPC server');
});

client.on('error', (err) => {
  console.error('Connection error:', err);
});

IPC এর সুবিধা:

ইউনিক্স ডোমেইন সকেট বা নামযুক্ত পাইপ ব্যবহার করে আইপিসি সংযোগগুলি সাধারণত টিসিপি সংযোগের চেয়ে দ্রুত এবং আরও নিরাপদ কারণ তারা নেটওয়ার্ক স্ট্যাক ব্যবহার করে না এবং স্থানীয় মেশিনে সীমাবদ্ধ।

সর্বোত্তম অনুশীলন

ত্রুটি হ্যান্ডলিং:আপনার অ্যাপ্লিকেশন ক্র্যাশ হওয়া থেকে রোধ করতে সবসময় সকেট ত্রুটিগুলি পরিচালনা করুন৷
সময়সীমা:নিষ্ক্রিয় সংযোগগুলি পরিচালনা করুন এবং রিসোর্স লিক রোধ করতে টাইমআউটগুলি প্রয়োগ করুন৷
কিপ-সুইং:বিচ্ছিন্নতা সনাক্ত করতে দূর-দূরত্বের সংযোগের জন্য কিপ-ওয়েভ ব্যবহার করুন
বাফারিং:আংশিক বার্তা পরিচালনা করার জন্য আপনার প্রোটোকলের জন্য সঠিক বার্তা ফ্রেমিং এবং বাফারিং প্রয়োগ করুন
সংযোগ সীমা:আপনার সার্ভার ওভারলোড এড়াতে server.maxConnections সেট করুন
সুন্দর আলিঙ্গন:রিসোর্স রিলিজ করার সময় সার্ভার বন্ধ করার সময় সঠিক ক্লিনআপ প্রয়োগ করুন
বাইনারি তথ্য:এনকোডিং সমস্যা এড়াতে স্ট্রিংয়ের পরিবর্তে বাফার অবজেক্ট ব্যবহার করুন বাইনারি ডেটা এক্সচেঞ্জের জন্য
পিঠের চাপ:ক্লায়েন্ট যখন ধরে রাখতে পারে না তখন ফলব্যাক পরিচালনা করতে socket.write() এর রিটার্ন মান পরীক্ষা করুন

নেট ভলিউম বনাম HTTP ব্লক

বৈশিষ্ট্য নেট মডিউল HTTP ব্লক
নৈতিকতা কাঁচা TCP/IP HTTP প্রোটোকল
বার্তা বিন্যাস কাস্টম (আপনি সংজ্ঞায়িত) HTTP অনুরোধ/প্রতিক্রিয়া
কম্প্রেশন স্তর নিম্ন-স্তরের, উচ্চ নিয়ন্ত্রণ উচ্চ-স্তরের, ব্যবহার করা সহজ
কেস ব্যবহার করুন কাস্টম প্রোটোকল, কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশন ওয়েব অ্যাপ্লিকেশন, REST API

নেট মডিউল ব্যবহার করার সময়:

HTTP মডিউল ব্যবহার করার সময়:

সারাংশ

Node.js Net TCP . :

কাস্টম প্রোটোকলের জন্য নিম্ন-স্তরের সকেট অ্যাক্সেস

সংযোগ পরিচালনার জন্য একটি অ্যাসিঙ্ক্রোনাস, ইভেন্ট-চালিত API

TCP/IP এবং IPC উভয় যোগাযোগের জন্য সমর্থন

উচ্চ-স্তরের প্রোটোকলের জন্য ব্লক তৈরি করা

যদিও এটির জন্য HTTP-এর মতো উচ্চ-স্তরের মডিউলের চেয়ে বেশি ম্যানুয়াল কাজের প্রয়োজন হয়, নেট মডিউলটি আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় প্রোটোকলটি বাস্তবায়নের জন্য নমনীয়তা প্রদান করে।

⚠️পর্যবেক্ষণ নোট:

নেটস্ট্যাট, ss, বা lsof-এর মতো টুল ব্যবহার করে সবসময় আপনার TCP সার্ভারের পারফরম্যান্স নিরীক্ষণ করুন যাতে বাধা এবং সংযোগের সমস্যা চিহ্নিত করা যায়।

অনুশীলন করুন

স্ট্রীম-ভিত্তিক TCP সার্ভার এবং ক্লায়েন্ট তৈরি করতে অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক API দ্বারা প্রদত্ত সঠিক মডিউল নামটি বেছে নিন।

http
✗ ভুল! "http" মডিউল HTTP প্রোটোকলের জন্য একটি উচ্চ-স্তরের API প্রদান করে, স্ট্রিম-ভিত্তিক TCP নয়
tcp
✗ ভুল! "tcp" Node.js-এ একটি বৈধ মডিউল নয়
net
✓ ঠিক আছে! "নেট" মডিউলটি স্ট্রিম-ভিত্তিক TCP সার্ভার এবং ক্লায়েন্ট তৈরি করার জন্য একটি অ্যাসিঙ্ক্রোনাস নেটওয়ার্ক API প্রদান করে।
socket
✗ ভুল! "সকেট" Node.js-এ একটি বৈধ মডিউল নয়