Ir al contenido

Servidor TCP con Node.js en un TouchBerry Pi o Raspberry PLC

Instala Node.js LTS, escribe un servidor eco con el módulo net, pruébalo con el cliente de la parte 2 y arráncalo con systemd
10 de diciembre de 2018 por
Servidor TCP con Node.js en un TouchBerry Pi o Raspberry PLC
Alejandro Jabalquinto

Para crear un servidor TCP en un TouchBerry Pi Panel PC o un Raspberry PLC, instala una versión LTS actual de Node.js y usa su módulo net, que viene incluido. net.createServer() atiende a cada cliente que se conecta, y listen(5566) abre el puerto en todas las interfaces de red del equipo. El ejemplo de este post es un servidor eco: responde con los mismos datos que recibe.

El servidor es el otro extremo del cliente TCP con Node.js de la misma serie. Funciona con ese cliente, con un Arduino PLC como cliente o con cualquier herramienta que abra una conexión TCP.

La primera versión de este post usaba un TouchBerry Pi 3, ya descatalogado, y Node.js 6. Los pasos son los mismos en el TouchBerry Pi Panel PC actual y en cualquier Raspberry PLC, porque los dos funcionan con Raspberry Pi OS (Debian).

TouchBerry Pi Panel PC de 18,5 pulgadas con un dashboard en la pantalla táctil
TouchBerry Pi Panel PC de 18,5": puede ejecutar el servidor TCP de este tutorial.
  1. Paso 1Instala Node.jsVersión LTS actual de NodeSource
  2. Paso 2Escribe server.jsMódulo net incluido, sin paquetes
  3. Paso 3PruébaloEn el equipo y desde el cliente
  4. Paso 4Arranque automáticoUn servicio de systemd

La red del ejemplo

EquipoFunciónDirección
TouchBerry Pi o Raspberry PLCServidor TCP192.168.1.30, puerto 5566
TouchBerry Pi, Raspberry PLC, PC o Arduino PLCCliente TCP192.168.1.25

Un servidor necesita una dirección que no cambie, o los clientes no lo encontrarán después de un reinicio. Dale primero una IP estática, con nmcli en Bookworm y Trixie o con dhcpcd.conf en sistemas anteriores. Los pasos están en cómo fijar una IP estática en un TouchBerry Pi o un Raspberry PLC.

Los dos equipos deben estar en la misma subred o tener una ruta entre ellos. Compruébalo con ip a e ip route.

Paso 1: instala Node.js LTS

Primero comprueba si Node.js ya está instalado:

node -v

Un Raspberry PLC preparado con la imagen o el script install.sh de Industrial Shields ya tiene Node.js, porque el script instala Node-RED con él. Si node -v muestra la versión 22 o posterior, pasa al paso 2.

Si falta Node.js o es más antiguo, no instales el paquete nodejs de Debian: Bookworm trae Node.js 18, que llegó al final de su vida en abril de 2025. Instala la versión LTS con el script de NodeSource:

sudo apt update
sudo apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_lts.x -o nodesource_setup.sh
sudo -E bash nodesource_setup.sh
sudo apt install -y nodejs
node -v

Esto sustituye el script setup_6.x de la primera versión de este post. Node.js 6 no tiene soporte desde 2019, y ese script ya no instala una versión con soporte.

Paso 2: escribe el servidor TCP

Crea una carpeta para el proyecto y abre un archivo nuevo:

mkdir -p ~/tcp-server
cd ~/tcp-server
nano server.js

Pega este código. Los comentarios explican cada parte:

#!/usr/bin/env node
// TCP server: accepts several clients and replies with the same data (echo)
const net = require('node:net');

const PORT = Number(process.argv[2]) || 5566; // TCP port to listen on
const HOST = '0.0.0.0'; // all IPv4 addresses of the device: eth0, eth1, wlan0

const server = net.createServer((socket) => {
  const who = `${socket.remoteAddress}:${socket.remotePort}`;
  console.log('Client connected: ' + who);

  socket.on('data', (data) => {
    console.log(`Received from ${who}: ${data.toString().trim()}`);
    socket.write(data); // reply with the same data
  });

  socket.on('error', (err) => console.error(`Error with ${who}: ${err.message}`));
  socket.on('close', () => console.log('Client disconnected: ' + who));
});

server.on('error', (err) => {
  console.error('Server error: ' + err.message); // for example EADDRINUSE
  process.exit(1);
});

server.listen(PORT, HOST, () => {
  console.log(`TCP server listening on ${HOST}:${PORT}`);
});

Cómo funciona:

  • net.createServer() ejecuta la función una vez por cada cliente que se conecta. Puede haber varios clientes conectados a la vez.
  • listen(PORT, '0.0.0.0') abre el puerto en todas las direcciones IPv4 del equipo, así que los clientes pueden usar la dirección de eth0, de eth1 o del Wi-Fi.
  • El evento data recibe lo que envía el cliente, y socket.write() se lo devuelve.
  • El evento error del servidor para el programa con código de salida 1 si no puede abrir el puerto, por ejemplo cuando otro programa lo usa.

El puerto se lee de la línea de órdenes, así que node server.js 6000 escucha en el puerto 6000. Sin argumento usa el 5566, como el cliente de la parte 2. Guarda con Ctrl+O y sal con Ctrl+X.

Paso 3: prueba el servidor

Arranca el servidor:

node server.js

En un segundo terminal del mismo equipo, conéctate con nc (netcat) y escribe una línea. El servidor te devuelve la misma línea. Cierra nc con Ctrl+C. Si no tienes nc, instálalo con sudo apt install netcat-openbsd.

nc 127.0.0.1 5566

Después prueba desde el otro equipo con el cliente de la parte 2, con la dirección del servidor:

node client.js 192.168.1.30 5566

El cliente muestra la respuesta:

Connected to 192.168.1.30:5566
Received: Hello from the TCP client
Connection closed

Y el servidor muestra quién se ha conectado y qué ha recibido:

TCP server listening on 0.0.0.0:5566
Client connected: 192.168.1.25:50412
Received from 192.168.1.25:50412: Hello from the TCP client
Client disconnected: 192.168.1.25:50412

Si el cliente no se conecta, revisa primero el lado del servidor:

SíntomaCausa probableQué hacer
EADDRINUSE al arrancar el servidorOtro programa, u otra copia del servidor, usa el puertoPáralo, o arranca el servidor con otro puerto
EACCES al arrancar el servidorLos puertos por debajo de 1024 necesitan permisos de rootUsa un puerto a partir de 1024, como el 5566
El cliente recibe ECONNREFUSEDNada escucha en esa dirección y puertoComprueba con ss -ltnp | grep 5566 que el servidor escucha
El cliente agota el tiempo de esperaDirección errónea, sin ruta o un cortafuegos en medioRevisa ip a en el servidor y ping 192.168.1.30 desde el cliente

Paso 4: arranca el servidor al encender el equipo

En una máquina, el servidor debe arrancar solo después de un corte de alimentación. Un servicio de systemd lo hace. Primero comprueba dónde está node:

which node

Con los paquetes de NodeSource, la respuesta es /usr/bin/node. Crea el archivo del servicio:

sudo nano /etc/systemd/system/tcp-server.service

Pega este contenido. Cambia el usuario pi y la carpeta si los tuyos son otros:

[Unit]
Description=TCP echo server with Node.js
After=network-online.target
Wants=network-online.target

[Service]
User=pi
WorkingDirectory=/home/pi/tcp-server
ExecStart=/usr/bin/node /home/pi/tcp-server/server.js 5566
Restart=on-failure

[Install]
WantedBy=multi-user.target

Activa y arranca el servicio, comprueba su estado y sigue sus mensajes:

sudo systemctl daemon-reload
sudo systemctl enable --now tcp-server
systemctl status tcp-server
journalctl -u tcp-server -f

Restart=on-failure vuelve a arrancar el servidor si se para con un error. Sal del registro con Ctrl+C: el servicio sigue funcionando.

Preguntas frecuentes sobre servidores TCP con Node.js

¿Necesito instalar algún paquete con npm?

No. El módulo net forma parte de Node.js, así que este servidor no necesita npm install.

¿Se pueden conectar varios clientes a la vez?

Sí. Node.js llama a la función de createServer() en cada conexión, y cada cliente tiene su propio socket. La prueba de este post conectó tres clientes a la vez.

¿Cómo leo mensajes completos?

TCP envía un flujo de bytes, no mensajes. Un evento data puede traer medio mensaje o dos mensajes. Si tus clientes acaban cada mensaje con \n, guarda los datos en un búfer y procésalos línea a línea.

¿Qué versión de Node.js debo usar?

Una versión LTS (soporte a largo plazo), que recibe actualizaciones de seguridad durante unos 30 meses. Hasta Node.js 26 solo las versiones pares pasan a LTS; a partir de Node.js 27 lo hacen todas las versiones principales. Comprueba node -v de vez en cuando.

TCP con equipos de Industrial Shields

El TouchBerry Pi Panel PC (7", 10,1" y 18,5") y el Raspberry PLC funcionan con Linux, así que el mismo servidor Node.js sirve para los dos.

Para ir más allá

Una conexión TCP es la forma en que un panel o un PLC con Linux habla con el resto de la línea. Estas páginas la usan en proyectos reales.

Buscar en nuestro blog

Servidor TCP con Node.js en un TouchBerry Pi o Raspberry PLC
Alejandro Jabalquinto 10 de diciembre de 2018
Compartir esta publicación
Etiquetas

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs