Node.js Socket Reference

Node.js இல் Socket பொருளைப் பயன்படுத்தி நெட்வொர்க் இணைப்புகளை நிர்வகிக்க கற்றுக்கொள்ளுங்கள்

Socket பொருள்

Socket வகுப்பு ஒரு duplex ஸ்ட்ரீம் ஆகும், இது நெட்வொர்க் இணைப்புகள் முழுவதும் தரவைப் படிக்கவும் எழுதவும் அனுமதிக்கிறது. இது Node.js இன் net தொகுதியில் client மற்றும் server இணைப்புகளுக்குப் பயன்படுத்தப்படுகிறது.

ஒரு Socket தொலைதூர முனையத்திற்கான TCP அல்லது IPC இணைப்பைக் குறிக்கிறது, இது இணைப்பு life cycle மற்றும் தரவை மாற்றுவதற்கான முறைகள் மற்றும் நிகழ்வுகளை வழங்குகிறது.

TCP & IPC இணைப்புகள்

TCP மற்றும் IPC இணைப்புகள் இரண்டையும் Socket ஆதரிக்கிறது

Duplex ஸ்ட்ரீம்

தரவை ஒரே நேரத்தில் படிக்கவும் எழுதவும் அனுமதிக்கிறது

Client & Server

Client மற்றும் Server இணைப்புகள் இரண்டிற்கும் பயன்படுத்தப்படுகிறது

Net தொகுதியை இறக்குமதி செய்தல்

// Net தொகுதியை இறக்குமதி செய்க
const net = require('net');

// ஒரு Socket உருவாக்க
const socket = new net.Socket();

Socket பண்புகள்

பண்பு விளக்கம்
socket.bufferSize இன்னும் அனுப்பப்படாத write buffer இல் உள்ள bytes எண்ணிக்கை
socket.bytesRead Socket மூலம் பெறப்பட்ட bytes எண்ணிக்கை
socket.bytesWritten Socket மூலம் அனுப்பப்பட்ட bytes எண்ணிக்கை
socket.connecting Socket இணைக்கப்படுகிறதா என்பதைக் குறிக்கும் boolean
socket.destroyed Socket அழிக்கப்பட்டதா என்பதைக் குறிக்கும் boolean
socket.localAddress Socket இன் உள்ளூர் IP முகவரி
socket.localPort Socket இன் உள்ளூர் port
socket.remoteAddress தொலைநிலை Socket இன் IP முகவரி
socket.remoteFamily தொலைநிலை Socket இன் IP குடும்பம் (எ.க., 'IPv4' அல்லது 'IPv6')
socket.remotePort தொலைநிலை Socket இன் port

Socket முறைகள்

முறை விளக்கம்
socket.connect(options[, connectListener]) Socket ஐ குறிப்பிட்ட முகவரி மற்றும் port உடன் இணைக்கிறது. options இல் port, host, localAddress, localPort மற்றும் பல அடங்கும்
socket.connect(path[, connectListener]) Socket ஐ குறிப்பிட்ட IPC path உடன் இணைக்கிறது
socket.connect(port[, host][, connectListener]) Socket ஐ குறிப்பிட்ட port மற்றும் host உடன் இணைக்கிறது
socket.destroy([error]) Socket ஐ அழிக்கிறது. error வழங்கப்பட்டால், அது 'error' நிகழ்வில் வெளியிடப்படும்
socket.end([data][, encoding][, callback]) விருப்ப தரவை அனுப்பி Socket ஐ மூடுகிறது, மேலும் தரவு அனுப்பப்படாது என்பதைக் குறிக்கிறது
socket.pause() தரவு வாசிப்பை இடைநிறுத்துகிறது, உள்வரும் தரவை buffer செய்ய அனுமதிக்கிறது
socket.resume() socket.pause() அழைப்புக்குப் பிறகு தரவு வாசிப்பைத் தொடர்கிறது
socket.setEncoding([encoding]) குறிப்பிட்ட encoding இல் தரவை encode செய்ய Socket ஐ அமைக்கிறது (இயல்புநிலை null, அதாவது Buffer பொருள்கள் திரும்பப் பெறப்படும்)
socket.setKeepAlive([enable][, initialDelay]) விருப்ப initialDelay மில்லி விநாடிகளில் keep-alive செயல்பாட்டை இயக்குகிறது/முடக்குகிறது
socket.setNoDelay([noDelay]) Nagle's algorithm ஐ இயக்குகிறது/முடக்குகிறது. true என அமைக்கப்படும் போது, தரவு buffer செய்யப்படாமல் உடனடியாக அனுப்பப்படும்
socket.setTimeout(timeout[, callback]) செயல்பாடு இல்லாத நிலையில் 'timeout' நிகழ்வு வெளியிடப்படும் Socket க்கு timeout அமைக்கிறது
socket.write(data[, encoding][, callback]) Socket க்கு தரவை எழுதுகிறது. தரவு flush செய்யப்பட்டால் true, அல்லது buffer செய்யப்பட்டால் false திரும்பும்

Socket நிகழ்வுகள்

நிகழ்வு விளக்கம்
'close' Socket முழுமையாக மூடப்படும் போது வெளியிடப்படுகிறது. hadError வாதம் Socket பிழையின் காரணமாக மூடப்பட்டதா என்பதைக் குறிக்கிறது
'connect' Socket இணைப்பு வெற்றிகரமாக நிறுவப்படும் போது வெளியிடப்படுகிறது
'data' தரவு பெறப்படும் போது வெளியிடப்படுகிறது. வாதம் பெறப்பட்ட தரவு (Buffer அல்லது String)
'drain' write buffer காலியாகும் போது வெளியிடப்படுகிறது
'end' Socket இன் மறுமுனை பரிமாற்ற முடிவைக் குறிக்கும் போது வெளியிடப்படுகிறது
'error' பிழை ஏற்படும் போது வெளியிடப்படுகிறது. 'close' நிகழ்வு இந்த நிகழ்வுக்குப் பிறகு நேரடியாக வெளியிடப்படும்
'lookup' hostname தீர்க்கப்பட்ட பிறகு ஆனால் இணைப்பதற்கு முன் வெளியிடப்படுகிறது. lookup பற்றிய விவரங்களை உள்ளடக்கியது
'ready' Socket பயன்படுத்த தயாராக இருக்கும் போது வெளியிடப்படுகிறது
'timeout' Socket செயல்பாடு இல்லாததால் timeout ஆகும் போது வெளியிடப்படுகிறது. இது只是一个 அறிவிப்பு - Socket தானாக மூடப்படாது

TCP Client உருவாக்குதல்

இந்த எடுத்துக்காட்டு ஒரு சேவையகத்துடன் இணையும் TCP client ஐ உருவாக்குவதைக் காட்டுகிறது:

const net = require('net');

// புதிய socket உருவாக்க
const client = new net.Socket();

// ஒரு சேவையகத்துடன் இணை
client.connect(8080, '127.0.0.1', () => {
  console.log('Connected to server');
  
  // சேவையகத்திற்கு தரவை அனுப்ப
  client.write('Hello, server! From client.');
});

// சேவையகத்திலிருந்து பெறப்பட்ட தரவைக் கையாள
client.on('data', (data) => {
  console.log(`Received from server: ${data.toString()}`);
  
  // பதில் பெற்ற பிறகு இணைப்பை மூடு
  client.end();
});

// இணைப்பு மூடலைக் கையாள
client.on('close', () => {
  console.log('Connection closed');
});

// பிழைகளைக் கையாள
client.on('error', (err) => {
  console.error(`Error: ${err.message}`);
});

TCP Server உருவாக்குதல்

இந்த எடுத்துக்காட்டு Socket இணைப்புகளைக் கையாளும் TCP server ஐ உருவாக்குவதை நிரூபிக்கிறது:

const net = require('net');

// TCP server உருவாக்க
const server = net.createServer((socket) => {
  // 'socket' என்பது client இணைப்பு - net.Socket இன் ஒரு instance
  
  console.log(`Client connected: ${socket.remoteAddress}:${socket.remotePort}`);
  
  // Encoding அமை
  socket.setEncoding('utf8');
  
  // Client இலிருந்து தரவைக் கையாள
  socket.on('data', (data) => {
    console.log(`Received from client: ${data}`);
    
    // தரவை client க்கு echo செய்
    socket.write(`You said: ${data}`);
  });
  
  // Client துண்டிப்பைக் கையாள
  socket.on('end', () => {
    console.log('Client disconnected');
  });
  
  // Socket பிழைகளைக் கையாள
  socket.on('error', (err) => {
    console.error(`Socket error: ${err.message}`);
  });
  
  // Client க்கு வரவேற்பு செய்தியை அனுப்ப
  socket.write('Welcome to the TCP server!\n');
});

// Port 8080 இல் server ஐத் தொடங்கு
server.listen(8080, '127.0.0.1', () => {
  console.log('Server listening on port 8080');
});

// Server பிழைகளைக் கையாள
server.on('error', (err) => {
  console.error(`Server error: ${err.message}`);
});

Socket Timeout

இந்த எடுத்துக்காட்டு Socket timeouts ஐ அமைப்பதும் கையாளுவதும் எப்படி என்பதை நிரூபிக்கிறது:

const net = require('net');

// Timeouts உடன் server உருவாக்க
const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // Socket timeout ஐ 10 விநாடிகளாக அமை
  socket.setTimeout(10000);
  
  // Socket timeout ஐக் கையாள
  socket.on('timeout', () => {
    console.log('Socket timeout - no activity for 10 seconds');
    socket.write('You have been inactive for too long. The connection will be closed.');
    socket.end();
  });
  
  // தரவைக் கையாள
  socket.on('data', (data) => {
    console.log(`Received: ${data.toString()}`);
    socket.write('Data received');
    
    // ஒவ்வொரு முறையும் தரவைப் பெறும்போது, timeout மீட்டமைக்கப்படும்
    console.log('Timeout timer reset');
  });
  
  // Socket மூடலைக் கையாள
  socket.on('close', () => {
    console.log('Socket closed');
  });
  
  // வரவேற்பு செய்தியை அனுப்ப
  socket.write('Welcome! This connection will timeout after 10 seconds of inactivity.\n');
});

// Server ஐத் தொடங்கு
const PORT = 8081;
server.listen(PORT, () => {
  console.log(`Timeout example server running on port ${PORT}`);
  
  // சோதனைக்கு: இணையும் ஆனால் தரவை அனுப்பாத client உருவாக்க
  const client = new net.Socket();
  client.connect(PORT, '127.0.0.1', () => {
    console.log('Test client connected');
    
    // 5 விநாடிகளுக்குப் பிறகு ஒரு செய்தியை அனுப்புவோம் (timeout க்கு முன்)
    setTimeout(() => {
      client.write('Hello after 5 seconds');
    }, 5000);
    
    // வேறு எதையும் அனுப்ப மாட்டோம், எனவே இணைப்பு timeout ஆக வேண்டும்
    // மற்றொரு 10 விநாடிகளுக்குப் பிறகு
  });
  
  client.on('data', (data) => {
    console.log(`Client received: ${data.toString()}`);
  });
  
  client.on('close', () => {
    console.log('Client disconnected');
  });
});

Socket விருப்பங்கள்

இந்த எடுத்துக்காட்டு பல்வேறு Socket விருப்பங்களை உள்ளமைப்பது எப்படி என்பதைக் காட்டுகிறது:

const net = require('net');

// விருப்பங்களுடன் Socket உருவாக்க
const socket = new net.Socket();

// Socket விருப்பங்களை உள்ளமை
socket.setKeepAlive(true, 1000); // 1 விநாடி ஆரம்ப தாமதத்துடன் keep-alive ஐ இயக்கு
socket.setNoDelay(true); // Nagle's algorithm ஐ முடக்கு (buffer செய்யாதது)

// ஒரு சேவையகத்துடன் இணை
socket.connect({
  port: 80,
  host: 'example.com',
  family: 4, // IPv4
  localAddress: '0.0.0.0', // bind செய்ய உள்ளூர் இடைமுகம்
  localPort: 8000 // bind செய்ய உள்ளூர் port
}, () => {
  console.log('Connected with options');
  
  // Socket தகவலைக் காட்டு
  console.log(`Local address: ${socket.localAddress}:${socket.localPort}`);
  console.log(`Remote address: ${socket.remoteAddress}:${socket.remotePort}`);
  console.log(`Remote family: ${socket.remoteFamily}`);
  
  // எளிய HTTP கோரிக்கையை அனுப்ப
  socket.write('GET / HTTP/1.1\r\n');
  socket.write('Host: example.com\r\n');
  socket.write('Connection: close\r\n');
  socket.write('\r\n');
});

// தரவைக் கையாள
let responseData = '';
socket.on('data', (data) => {
  const chunk = data.toString();
  responseData += chunk;
  
  // பதிலின் முதல் வரியைக் காட்டு
  if (responseData.includes('\r\n') && !socket.firstLineShown) {
    const firstLine = responseData.split('\r\n')[0];
    console.log(`First line of response: ${firstLine}`);
    socket.firstLineShown = true;
  }
});

// தரவு முடிவைக் கையாள
socket.on('end', () => {
  console.log('Response complete');
  console.log(`Total bytes received: ${socket.bytesRead}`);
  console.log(`Total bytes sent: ${socket.bytesWritten}`);
});

// பிழைகளைக் கையாள
socket.on('error', (err) => {
  console.error(`Socket error: ${err.message}`);
});

Socket Buffers உடன் பணிபுரிதல்

இந்த எடுத்துக்காட்டு Socket buffering மற்றும் 'drain' நிகழ்வை நிரூபிக்கிறது:

const net = require('net');

// Buffer கையாளுதலை நிரூபிக்க server உருவாக்க
const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // Buffer ஐ வேகமாக நிரப்புவதை நிரூபிக்க சிறியதாக்கு
  socket.bufferSize = 1024; // குறிப்பு: இது உண்மையில் buffer அளவைக் கட்டுப்படுத்தாது
  
  // Client க்கு மெதுவான பதிலை அனுப்புவதன் மூலம் buffering ஐ நிரூபிக்க
  socket.on('data', (data) => {
    console.log(`Received data: ${data.toString().trim()}`);
    console.log('Sending large response...');
    
    // Buffer நிரம்பும் வரை தரவை எழுதும் செயல்பாடு
    const writeUntilBufferFull = () => {
      // அனுப்ப சில தரவை உருவாக்கு
      const chunk = 'x'.repeat(1024);
      
      // Buffer நிரம்பும் வரை எழுதுவதைத் தொடர் (write false திரும்பும்)
      let i = 0;
      while (i < 100) {
        const canContinue = socket.write(`Chunk ${i}: ${chunk}\n`);
        console.log(`Wrote chunk ${i}, buffer full? ${!canContinue}`);
        
        // Buffer நிரம்பியிருந்தால், அது drain ஆகக் காத்திரு
        if (!canContinue) {
          console.log(`Buffer is full after ${i} writes. Current buffer size: ${socket.bufferSize} bytes`);
          // எழுதுவதை நிறுத்தி 'drain' நிகழ்வுக்குக் காத்திரு
          socket.once('drain', () => {
            console.log('Buffer drained, resuming writes');
            writeUntilBufferFull();
          });
          return;
        }
        i++;
      }
      
      // அனைத்து chunks எழுதப்பட்டது
      console.log('All data sent');
      socket.end('\nTransmission complete');
    };
    
    // எழுதும் செயல்முறையைத் தொடங்கு
    writeUntilBufferFull();
  });
  
  socket.on('end', () => {
    console.log('Client disconnected');
  });
  
  socket.on('error', (err) => {
    console.error(`Socket error: ${err.message}`);
  });
  
  socket.write('Send any message to receive a large response\n');
});

// Server ஐத் தொடங்கு
const PORT = 8082;
server.listen(PORT, () => {
  console.log(`Buffer demonstration server running on port ${PORT}`);
  
  // நிரூபணத்திற்கு, இணைந்து செய்தியை அனுப்பும் client உருவாக்க
  const client = new net.Socket();
  
  client.connect(PORT, '127.0.0.1', () => {
    console.log('Test client connected');
    
    // 1 விநாடிக்குப் பிறகு செய்தியை அனுப்பு
    setTimeout(() => {
      client.write('Please send me a large response');
    }, 1000);
  });
  
  let receivedData = 0;
  client.on('data', (data) => {
    receivedData += data.length;
    console.log(`Client received ${data.length} bytes, total: ${receivedData}`);
  });
  
  client.on('end', () => {
    console.log(`Client disconnected after receiving ${receivedData} bytes`);
    process.exit(0);
  });
  
  client.on('error', (err) => {
    console.error(`Client error: ${err.message}`);
  });
});

IPC Socket தகவல்தொடர்பு

இந்த எடுத்துக்காட்டு Unix domain sockets பயன்படுத்தி Inter-Process Communication (IPC) ஐ நிரூபிக்கிறது:

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

// IPC path - OS ஐப் பொறுத்து
const socketPath = process.platform === 'win32'
  ? path.join('\\\\?\\pipe', process.cwd(), 'ipc-demo.sock')
  : path.join(process.cwd(), 'ipc-demo.sock');

// ஏற்கனவே உள்ள socket கோப்பை அகற்று (Unix மட்டும்)
if (process.platform !== 'win32' && fs.existsSync(socketPath)) {
  fs.unlinkSync(socketPath);
}

// IPC server உருவாக்க
const server = net.createServer((socket) => {
  console.log('Client connected to IPC socket');
  
  socket.on('data', (data) => {
    const message = data.toString().trim();
    console.log(`Server received: ${message}`);
    
    // Echo back
    socket.write(`Echo: ${message}`);
  });
  
  socket.on('end', () => {
    console.log('Client disconnected from IPC socket');
  });
  
  socket.write('Connected to IPC server\n');
});

// Server பிழைகளைக் கையாள
server.on('error', (err) => {
  console.error(`IPC server error: ${err.message}`);
});

// IPC server ஐத் தொடங்கு
server.listen(socketPath, () => {
  console.log(`IPC server listening on ${socketPath}`);
  
  // IPC socket உடன் இணையும் client உருவாக்க
  const client = new net.Socket();
  
  client.on('data', (data) => {
    console.log(`Client received: ${data.toString().trim()}`);
  });
  
  client.on('end', () => {
    console.log('Disconnected from IPC server');
  });
  
  client.on('error', (err) => {
    console.error(`IPC client error: ${err.message}`);
  });
  
  // IPC server உடன் இணை
  client.connect(socketPath, () => {
    console.log('Connected to IPC server');
    client.write('Hello via IPC socket');
    
    // பல செய்திகளை அனுப்பு
    setTimeout(() => {
      client.write('Message 1');
    }, 1000);
    
    setTimeout(() => {
      client.write('Message 2');
      client.end(); // கடைசி செய்தியை அனுப்பிய பிறகு மூடு
    }, 2000);
  });
});

// exit இல் cleanup
process.on('exit', () => {
  if (process.platform !== 'win32' && fs.existsSync(socketPath)) {
    fs.unlinkSync(socketPath);
  }
});

// Ctrl+C ஐக் கையாள
process.on('SIGINT', () => {
  console.log('Shutting down...');
  process.exit(0);
});

Half-Closed Sockets

இந்த எடுத்துக்காட்டு half-closed இணைப்புகளை நிரூபிக்கிறது, அங்கு ஒரு பக்கம் தங்கள் write stream ஐ முடித்துவிட்டாலும் இன்னும் தரவைப் பெற முடியும்:

const net = require('net');

// Server உருவாக்க
const server = net.createServer((socket) => {
  console.log('Client connected');
  
  // ஆரம்ப செய்தியை அனுப்பு
  socket.write('Welcome to the half-close demonstration server\n');
  
  // Client இலிருந்து தரவைக் கையாள
  socket.on('data', (data) => {
    console.log(`Server received: ${data.toString().trim()}`);
  });
  
  // Socket end (client தங்கள் write stream ஐ முடித்தது)
  socket.on('end', () => {
    console.log('Client ended their write stream (half-closed)');
    
    // அவர்கள் தங்கள் write stream ஐ முடித்த பிறகும் client க்கு இன்னும் எழுதலாம்
    socket.write('You have ended your side of the connection, but I can still talk to you.');
    
    // தாமதத்திற்குப் பிறகு எங்கள் பக்கத்தை மூடு
    setTimeout(() => {
      console.log('Server now closing its write stream');
      socket.end('Goodbye! Closing my side of the connection now.');
    }, 8080);
  });
  
  // முழுமையான Socket மூடலைக் கையாள
  socket.on('close', (hadError) => {
    console.log(`Socket fully closed. Had error: ${hadError}`);
  });
  
  socket.on('error', (err) => {
    console.error(`Socket error: ${err.message}`);
  });
});

// Server ஐத் தொடங்கு
const PORT = 8083;
server.listen(PORT, () => {
  console.log(`Half-close demonstration server running on port ${PORT}`);
  
  // நிரூபணத்திற்கு client உருவாக்க
  const client = new net.Socket();
  
  client.connect(PORT, '127.0.0.1', () => {
    console.log('Client connected');
    
    // சில தரவை அனுப்பு
    client.write('Hello from client');
    
    // தாமதத்திற்குப் பிறகு client write stream ஐ முடி (half-close)
    setTimeout(() => {
      console.log('Client ending its write stream (half-closing)');
      client.end();
      
      // இனி எழுத முடியாது, ஆனால் இன்னும் தரவைப் பெற முடியும்
      console.log('Client waiting to receive more data...');
    }, 2000);
  });
  
  // Server இலிருந்து தரவைக் கையாள
  client.on('data', (data) => {
    console.log(`Client received: ${data.toString().trim()}`);
  });
  
  // Server தங்கள் write stream ஐ மூடுவதைக் கையாள
  client.on('end', () => {
    console.log('Server ended its write stream, connection fully closed');
  });
  
  // முழுமையான இணைப்பு மூடலைக் கையாள
  client.on('close', (hadError) => {
    console.log(`Client connection fully closed. Had error: ${hadError}`);
  });
  
  client.on('error', (err) => {
    console.error(`Client error: ${err.message}`);
  });
});

Socket Programming க்கான சிறந்த நடைமுறைகள்

Node.js இல் Sockets உடன் பணிபுரியும் போது, இந்த சிறந்த நடைமுறைகளைக் கவனியுங்கள்:

பிழை கையாளுதல்: unhandled exceptions தடுக்க 'error' நிகழ்வை எப்போதும் கையாளுங்கள்
வளங்களை சுத்தம் செய்தல்: memory leaks தவிர்க்க Sockets சரியாக மூடப்பட்டுள்ளதை உறுதிப்படுத்துங்கள்
Buffer மேலாண்மை: socket.bufferSize கண்காணிக்கவும் மற்றும் memory issues தவிர்க்க பெரிய அளவிலான தரவை அனுப்பும் போது 'drain' நிகழ்வைப் பயன்படுத்தவும்
Timeouts: stale connections கையாள socket.setTimeout() உடன் பொருத்தமான timeouts அமைக்கவும்
Keep-alive: நீண்ட நேரம் இயங்கும் இணைப்புகளுக்கு keep-alive அமைப்புகளை உள்ளமைக்கவும்
தரவு encoding: socket.setEncoding() உடன் பொருத்தமான encoding அமைக்கவும் அல்லது binary தரவைப் பொருத்தமாக கையாளவும்
பாதுகாப்பு: பாதுகாப்பான தகவல்தொடர்புக்கு, raw TCP sockets க்கு பதிலாக TLS/SSL தொகுதியை (tls) பயன்படுத்தவும்
Backpressure: backpressure கையாள socket.write() இன் return value கவனிக்கவும்

பயிற்சி

Node.js இல் Socket பொருளை உருவாக்க பயன்படுத்தப்படும் சரியான முறையைத் தேர்வு செய்யவும்.

net.createSocket()
✗ தவறு! "net.createSocket()" என்பது Node.js இல் ஒரு செல்லுபடியாகும் முறை அல்ல
net.newSocket()
✗ தவறு! "net.newSocket()" என்பது Node.js இல் ஒரு செல்லுபடியாகும் முறை அல்ல
new net.Socket()
✓ சரி! "new net.Socket()" என்பது Node.js இல் Socket பொருளை உருவாக்க பயன்படும் சரியான முறையாகும்
net.initSocket()
✗ தவறு! "net.initSocket()" என்பது Node.js இல் ஒரு செல்லுபடியாகும் முறை அல்ல