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).
- Paso 1Instala Node.jsVersión LTS actual de NodeSource
- Paso 2Escribe server.jsMódulo net incluido, sin paquetes
- Paso 3PruébaloEn el equipo y desde el cliente
- Paso 4Arranque automáticoUn servicio de systemd
La red del ejemplo
| Equipo | Función | Dirección |
|---|---|---|
| TouchBerry Pi o Raspberry PLC | Servidor TCP | 192.168.1.30, puerto 5566 |
| TouchBerry Pi, Raspberry PLC, PC o Arduino PLC | Cliente TCP | 192.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 deeth0, deeth1o del Wi-Fi.- El evento
datarecibe lo que envía el cliente, ysocket.write()se lo devuelve. - El evento
errordel 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íntoma | Causa probable | Qué hacer |
|---|---|---|
EADDRINUSE al arrancar el servidor | Otro programa, u otra copia del servidor, usa el puerto | Páralo, o arranca el servidor con otro puerto |
EACCES al arrancar el servidor | Los puertos por debajo de 1024 necesitan permisos de root | Usa un puerto a partir de 1024, como el 5566 |
El cliente recibe ECONNREFUSED | Nada escucha en esa dirección y puerto | Comprueba con ss -ltnp | grep 5566 que el servidor escucha |
| El cliente agota el tiempo de espera | Dirección errónea, sin ruta o un cortafuegos en medio | Revisa 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
- Fijar una IP estática en un TouchBerry Pi o un Raspberry PLC
- Cliente TCP con Node.js
- Cliente TCP en un Arduino PLC, si el cliente es un M-Duino
- Servidor TCP en un Arduino PLC
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.
PLC Solution Library
Socket TCP entre Python y Node-RED en un Raspberry PLC
Un proceso de control en Python y un dashboard de Node-RED intercambian datos de un encoder y órdenes de marcha, paro y salida por TCP.
Ver el ejemplo
Caso de estudio
Embotellado de agua con un TouchBerry Pi Panel PC
Un TouchBerry Pi de 7" controla una estación de embotellado como PLC y HMI: cinta, sensores, cilindro y bomba en sus propias E/S.
Leer el caso de estudio