El modulo net
El modulo net nos permite crear una comunicación de manera bidireccional para conectar un cliente y un servidor que tiene una intercambio constante de información (no se cierra la conexión hasta que lo indiquemos), a diferencia del modulo http que tiene mayor complejidad al manejar cabeceras y no mantiene la conexión una vez se transmita el mensaje (esto esta cambiando con las nuevas versiones http/2).
Cliente y servidor con el modulo net
Queremos demostrar como implementar una comunicación por medio de socket entre un cliente y un servidor, para eso vamos a utilizar el modulo net de nodejs. Debemos tener en cuenta que toda la lógica recae en el servidor y por tal motivo muchos frameworks abstraen toda esta complejidad, en este ejemplo no vamos a aplicar ninguna lógica compleja, como podría ser hacer un broadcast, o crear grupos.
Mi primer servidor con Sockets
Vamos a crear un servidor con el modulo net para intercambiar datos, de tal manera que reciba todos los mensajes de los clientes y realice algunas operaciones según el mensaje recibido.
Lo primero que debemos saber son los comandos para inicializar un servidor:
// server.js
const net = require('net');
const server = net.createServer(function (socket) {
// Socket is an instance for each client
});
server.listen(8080, function () {
console.log('server is listening');
});
Con los comandos anteriores ya tenemos un servidor corriendo en el puerto 8080, donde el parámetro socket
representa la conexión de un usuario, por lo tanto este parámetro va tener unos métodos que nos van a permitir tener una comunicación con el cliente por medio de métodos o eventos predeterminados tales como:
// Send message to the client
socket.write("Welcome!");
// Event when arrive data
socket.on('data', (message) => {
// Some logic
});
// Event when client disconnect
socket.on('end', () => {
// Some logic
});
// on events: close, connect, data, drain, end, error, lookup, timeout
//https://nodejs.org/api/net.html#net_class_net_socket
Si queremos hacer algunas pruebas podemos crear un cliente con el mismo modulo net, sin embargo si nos encontramos en un sistema operativo linux o macOs podemos usar el siguiente comando para interactuar con el servidor:
telnet localhost 8080
Mi primer cliente con sockets
Ahora que tenemos nuestro servidor lo deseable es tener clientes con los cual hacer pruebas, para llevar a cabo esta tarea vamos a crear un cliente con el modulo net desde el backend, donde básicamente tenemos que conectarnos al servidor y encontrar la manera de enviarle datos por medio de la terminal.
//client.js
const net = require('net');
const client = net.connect({port: 8080}, () => {
console.log('client connected to server');
});
// Event when server send data
client.on('data', (message) => {
console.log(message.toString());
});
// Event when server disconnect
client.on('end', () => {
console.log('server disconnected');
});
Para enviar datos podemos usar el modulo process, el cual nos va permitir recolectar los datos que se escriban en la terminal, y de esta forma poder enviar esta información a nuestro servidor:
// reading console text
process.stdin.on('data', function(data){
// data is a buffer
const message = data.toString().trim();
if (message === 'exit') {
// End connection
client.end();
}
else {
// send data to server
client.write(data);
}
});
SocketIo
SocketIo es una librería para crear una comunicación bidireccional en tiempo real y aunque en un principio creeríamos que es igual al modulo net con una mayor abstracción de la complejidad, la verdad es que es mucho más ya que nos permite trabajar con diferentes protocolos de transporte pero siempre trabajando sobre su protocolo propio, esto significa que un servidor hecho con socketIO solo se conectará con un cliente hecho con socketIo.
Vamos a crear un cliente y un servidor con SocketIo, la librería más conocida en Nodejs para crear sockets para tener un punto de comparación con el modulo net.
Server
Para utilizar la librería debemos primero instalar el paquete npm install socket.io
y una vez lo tengamos nos podremos dar cuenta que es muy similar a nuestro servidor anterior:
// server.js
// We can pass a http server as parameter
const server = require('socket.io')();
server.on('connection', socket => {
// Some logic
});
server.listen(8080);
A diferencia del modulo net donde debemos interactuar con el evento data para poder intercambiar datos, socketIo nos permite crear nuestros eventos personalizados de manera directa.
// Send message to the client by customEvent
client.emit("customClientMessage", "Welcome");
// Custom event when arrive data
client.on('customServerMessage', data => {
// Logic
});