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