domingo, 21 de junio de 2020

Eventos y sockets

Eventos y sockets

Eventos

Un evento es una accion que detecta un programa y ejecuta una cierta funcionalidad, donde tenemos un sujeto, un cambiador de estado y una serie de observadores, cuando el cambiador de estado hace un cambio de estado en el sujeto este es notificado a todos los observadores.

 

 

 

 

 

Para los definir los eventos existen dos clases:

  • on() que tiene por nombre x y es la que define la funcionalidad del evento.
  • emit() es la dispara el evento x que tiene por nombre y desencadena la funcionalidad del evento.

 

 La clase sujeto.js:

var events = require('events');

var util = require('util');

var Sujeto = function(){

    this.estado=0;

    events.EventEmitter.call(this);    

}

util.inherits(Sujeto,events.EventEmitter); //Nuestra clase derivada de events.EventEmitter

Sujeto.prototype.setEstado = function(){ //Función que dispara el evento

   this.emit('cambiaEstado');

}

 module.exports = Sujeto;

 

La clase sujeto tiene las dos clases derivadas de events.EventEmitter que son emit() y on()

 

 La clase cambiadorEstado.js

var Sujeto = require('./sujeto.js');

var Observador1 = require('./observador1.js');

var Observador2 = require('./observador2.js');

var sujeto = new Sujeto();

var estado = 1;

sujeto.on('cambiaEstado', function() {

    Observador();

    Observador2();

}); 

sujeto.setEstado();

 

La clase cambiadorEstado define la funcionalidad en sujeto.on(‘cambiaEstado’, function()…) que al ser disparada se lo comunica a los observadores y en sujeto.setEstado() es donde se dispara el evento.

 

Las siguientes clases son los observadores:

 

 La clase observador1.js

var Observador1 =function(){

  console.log('Soy el observador 1');

}

module.exports = Observador1;

 

 La clase observador2.js

 var Observador2 =function(){

  console.log('Soy el observador 2');

}

module.exports = Observador2;

 
 

Sockets

 

Sirven para la comunicación entre cliente y servidor sin necesidad de peticiones HTTP, permiten la comunicación bidireccional tanto unicast como multicast en tiempo real entre un cliente y el servidor

Tipos de envios:

  • Unicast: Envío a un solo destino.
  • Broadcast: Envío a todos los destinos posibles de la red del host emisor.
  • Multicast: Envío a un grupo especifico de destinos.

Se compone de dos partes:

  • La parte cliente que esta en el navegador
  • La parte servidora que esta en el servidor

En nodeJS debemos instalar los siguientes paquetes

       npm install sockect.io

   npm install socket.io-client

Cuando un navegador establezca una conexión con el servidor se disparara el evento connection, y el dato recibido en la función de callback será el socket que es otro emisor de eventos que podrá enviar y recibir datos

Crearemos una instancia del socket en el servidor

var socket_io = require('socket.io');

…..

var server = http.createServer(app);

var io =socket_io(server);

 

Por defecto tenemos dos eventos en escucha:

  •  connection
  •  disconnect

 

Cuando un navegador establezca una conexión con el servidor se disparara el evento connection, y el dato recibido en la funcion de callback sera el socket que es otro emisor de eventos que podra enviar y recibir datos

 

io.on('connection',function(socket){

…..

});

 

El objeto socket es otro emisor de eventos, podemos emitir y recibir lo que queramos

.emit enviamos datos

.on recogemos datos

 

El evento disconnect  se ejecuta cuando se cierre o cambie de url

Tipos de eventos que puede enviar y recibir el servidor:

  • Evento unicast

Emite un evento al cliente que ha iniciado la comunicación

  En el servidor:

  socket.emit('conectado',{mensaje : 'Te has conectado correctamente'});

 En el cliente:

 socket.on('conectado',function(mensaje){

        ……..

  });

  • Evento broadcast

Como la variable socket pertenece a un cliente hacemos broadcast a todos los clientes menos a su dueño

  En el servidor:

      socket.broadcast.emit('nuevaconexion',{mensaje : 'Nuevo cliente conectado'});

 En el cliente:

 socket.on('nuevaconexion',function(mensaje){

        ……..

  });

 

  • Evento multicast

A todos los sockets de todos los clientes

Usaremos el objeto io.emit

 En el servidor:

  io.emit('nuevomensaje', {numMensajes : nMensajes});

 En el cliente:

socket.on('nuevomensaje',function(numMensajes){

…..

});

 

En el cliente:

 

Para lanzar socket.io-cliente que se ejecutara en el navegador crearemos un fichero de javascript  y lo importaremos como script en el html, al usar librerias de nodeJS, usaremos el paquete browserify que nos compila el modulo para usarlo en el navegador

 

En fichero de javascript crearemos una instancia del socket en el servidor:

var io = require('socket.io-client');

var socket = io();

socket.emit('evento',{<objeto JSON>});

socket.on('evento',function(mensaje){

        ……..

 });


No hay comentarios:

Publicar un comentario