typescriptadvanced

TCP Server and Client with Net Module

Build TCP server and client pairs using Node.js net module with connection pooling and message framing.

typescript
import net from 'net';

// Message framing: length-prefixed protocol
function encodeMessage(data: string): Buffer {
  const body = Buffer.from(data, 'utf8');
  const header = Buffer.alloc(4);
  header.writeUInt32BE(body.length, 0);
  return Buffer.concat([header, body]);
}

function createParser(onMessage: (msg: string) => void) {
  let buffer = Buffer.alloc(0);
  return (chunk: Buffer) => {
    buffer = Buffer.concat([buffer, chunk]);
    while (buffer.length >= 4) {
      const len = buffer.readUInt32BE(0);
      if (buffer.length < 4 + len) break;
      const msg = buffer.subarray(4, 4 + len).toString('utf8');
      buffer = buffer.subarray(4 + len);
      onMessage(msg);
    }
  };
}

// TCP Server
const server = net.createServer((socket) => {
  const addr = `${socket.remoteAddress}:${socket.remotePort}`;
  console.log(`Client connected: ${addr}`);

  const parse = createParser((msg) => {
    console.log(`[${addr}] ${msg}`);
    const response = JSON.stringify({ echo: msg, timestamp: Date.now() });
    socket.write(encodeMessage(response));
  });

  socket.on('data', parse);
  socket.on('end', () => console.log(`Client disconnected: ${addr}`));
  socket.on('error', (err) => console.error(`Socket error: ${err.message}`));
});

server.listen(9000, () => console.log('TCP server on port 9000'));

// TCP Client
function createClient(port: number, host = 'localhost') {
  const socket = net.createConnection({ port, host });
  const parse = createParser((msg) => {
    console.log(`Response: ${msg}`);
  });

  socket.on('connect', () => {
    console.log('Connected to server');
    socket.write(encodeMessage('Hello, TCP server!'));
    socket.write(encodeMessage(JSON.stringify({ action: 'ping' })));
  });

  socket.on('data', parse);
  socket.on('end', () => console.log('Disconnected'));
  return socket;
}

// Uncomment to test as client:
// createClient(9000);

Use Cases

  • Custom protocol implementation
  • Inter-process communication
  • IoT device communication

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.