nx.js
Concepts

Networking

TCP and UDP networking

nx.js provides APIs for TCP and UDP networking. The TCP socket interface is based on the WinterCG Socket API proposal. UDP datagrams are supported via Switch.listenDatagram().

TCP Client

// "tcpbin.com" is a public TCP echo server
const socket = Switch.connect('tcpbin.com:4242');

const decoder = new TextDecoder();
const encoder = new TextEncoder();
const reader = socket.readable.getReader();
const writer = socket.writable.getWriter();

const payload = 'Hello World!\n';
console.log('Sending:  %j', payload);
await writer.write(encoder.encode(payload));

console.log('Received: %j', decoder.decode(await reader.read()));
// Prints "Hello World!\n"

await writer.close();
reader.releaseLock();
socket.close();

TCP Server

// A simple echo server
const port = 2323;

const server = Switch.listen({
    port,
    async accept(socket) {
        console.log('Client connection established');
        const reader = socket.readable.getReader();
        const writer = socket.writable.getWriter();
        for await (const chunk of reader) {
            if (chunk.done) break;
            await writer.write(chunk.value);
        }
        await writer.close();
        reader.releaseLock();
        console.log('Client closed connection');
    },
});

const { ip } = Switch.networkInfo();
console.log('Echo server listening on "%s:%d"', ip, port);

UDP Datagram Socket

const socket = Switch.listenDatagram({
    port: 9999,
    message(e) {
        console.log(`From ${e.remoteAddress}:${e.remotePort}:`, e.data);
        socket.send('pong', e.remoteAddress, e.remotePort);
    },
});

const addr = socket.address;
console.log(`Listening on ${addr.address}:${addr.port}`);

Broadcast

const socket = Switch.listenDatagram({ port: 9999 });
socket.setBroadcast(true);
socket.send('hello network', '255.255.255.255', 9999);

Multicast

const socket = Switch.listenDatagram({
    port: 5353,
    message(e) {
        console.log('Multicast message:', e.data);
    },
});

socket.addMembership('239.255.255.250');

Learn more

On this page