Skip to content

Instantly share code, notes, and snippets.

@kfox
Last active September 23, 2025 07:02
Show Gist options
  • Save kfox/1280c2f0ee8324067dba15300e0f2fd3 to your computer and use it in GitHub Desktop.
Save kfox/1280c2f0ee8324067dba15300e0f2fd3 to your computer and use it in GitHub Desktop.
TCP echo server for Node.js

TCP echo server for Node.js

Usage

  1. Make sure you have a modern-ish version of Node.js installed.
  2. Type npx https://gist.github.com/kfox/1280c2f0ee8324067dba15300e0f2fd3
  3. Connect to it from a client, e.g. netcat or similar: nc localhost 9000
#!/usr/bin/env node
import net from 'node:net'
const port = process.argv[2] || 9000
const server = net.createServer((connection) => {
const { address, port } = connection.address()
const socket = `${address}:${port}`
console.log(`${socket} - client connected`)
connection.on('data', (data) => {
console.log(`${socket} - client sent: %s`, String(data).trim())
connection.write(data)
})
connection.on('end', () => {
console.log(`${socket} - client disconnected`)
})
})
server.listen({ port }, () => {
const { address, port } = server.address()
console.log('listening on %s:%d', address, port)
})
{
"name": "tcp-echo-server",
"version": "1.0.0",
"bin": "./echo.mjs"
}
@renatoargh
Copy link

Amazing, it works now! Super cool idea, by the way

@guest271314
Copy link

Using WHATWG Streams

import { Server } from "node:net";
import { Duplex } from "node:stream";

const abortable = new AbortController();
const {
  signal,
} = abortable;

const connectionListener = async (socket) => {
  const { readable, writable } = Duplex.toWeb(socket);
  const writer = writable.getWriter();
  await readable.pipeTo(
    new WritableStream({
      async write(value, controller) {
        await writer.write(value);
      },
      close() {},
      abort(reason) {},
    }),
  ).catch(() => {});
};

const tcpserver = new Server({
  highWaterMark: 0,
  noDelay: true,
}, connectionListener);

tcpserver.listen({
  port: 8080,
  host: "127.0.0.1",
  signal,
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment