Socket.IO

El JQuery de los Websockets

Socket.IO es una librería que permite trabajar con websockets de forma simplificada y sencilla, es compatible con la mayoría de navegadores y probablemente sea la librería más popular que trabaja con este protocolo. Un punto  importante de esta librería es que ofrece la misma interface mediante lenguaje Javascript tanto para el lado del cliente como para el lado del servidor. Para ampliar información es recomendable revisar la documentación oficial de Socket.IO.

INSTALAR SOCKET.IO

  1. npm i socket.io

Socket.IO se comunica a través de eventos, para ello, dispone de distintos eventos y permite trabajar con ellos tanto en el lado del servidor como en el lado del cliente. A continuación los eventos básicos para el intercambio de datos.

on: Método que detecta los eventos

connection: Evento de conexión 

disconnect: Evento de desconexión

emit: Método que permite emitir un evento  y enviar datos al servidor y a todos los clientes conectados

broadcast.emit: Método que permite emitir un evento  enviar datos al servidor y a todos los clientes conectados, excepto al que lo inicia.

INTERCAMBIO DE DATOS

El intercambio de datos se inicia desde el servidor mediante el método on que captura el evento y el evento connection que detecta la conexión. El método on requiere de dos parámetros, un evento, que puede ser un evento propio o un evento de SocketIO , y un callback que permite continuar el proceso.

  1. io.on("connection",socket => {
  2. }
El cliente debe disponer de la librería SocketIO para poder emitir o capturar eventos, de la misma forma que se hace en el servidor. El script se puede realizar desde el mismo archivo o desde un archivo externo.

  1. <script src="./socket.io/socket.io.js"></script>

  2. <script src="./script.js"></script>
INTERCAMBIO DE DATOS BÁSICO CON SOCKETIO

A continuación un ejemplo de un intercambio de datos entre un servidor básico y un cliente, basado en un archivo estático (index.html) que inicia una conexión mediante SocketIOUna vez inicia la conexión, el servidor emite un evento enviando un mensaje de confirmación que el cliente recibe y muestra en pantalla.

  1. const http = require("http").createServer(handler),
  2. fs = require("fs"),
  3. io = require("socket.io")(http)
  4. let discEvent = "conexión finalizada"
  5. let name={};
  6. function handler(req,res){
  7. fs.readFile(__dirname+"/index.html", (err,data) => {
  8. if(err) {
  9. res.writeHead(500,{"Content-Type":"text/html"})
  10. return res.send("Error Interno del Servidor")
  11. }else{
  12. res.writeHead(200,{"Content-Type":"text/html"})
  13. return res.end(data,"utf-8")
  14. }
  15. })
  16. }
  17. http.listen(3000,console.log("Servidor corriendo desde el localhost:3000"))
  18. io.on("connection",socket => {
  19. socket.emit("evento",{message: "conexión iniciada"})
  20. }
Desde el cliente (index.html)  se captura el evento mediante el método on que recoge los datos se añaden a un elemento html que permite visualizarlos en la pantalla de forma instantánea.

  1. <!DOCTYPE HTML>
  2. <html lang="es">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>SocketIO</title>
  7. </head>
  8. <body>
  9. <h1>Comunicación con SocketIO</h1>
  10. <p id="div"></p>
  11. <script src="./socket.io/socket.io.js"></script>
  12. <script>
  13. ((d,io) => {
  14. io.on("evento",data =>{
  15. console.log(data)
  16. d.getElementById("div").textContent = data.message
  17. })
  18. })(document,io());
  19. </script>
  20. </body>
  21. </html>
De esta forma se puede continuar capturando y emitiendo otros eventos. Eventos como pueden ser el evento click (propio de Javascript) que detecta cuando se pulsa un botón o el evento disconnect (de SocketIO) que detecta la desconexión por parte del cliente. 

INTERCAMBIO DE DATOS CON VARIOS EVENTOS
El código siguiente ejemplifica los distintos eventos anteriormente mencionados. Emite un evento enviando un mensaje de bienvenida al iniciar la conexión y captura otros dos eventos, uno al presionar un botón y otro al desconectarse. Se puede observar como en la captura de este último evento (disconnect) se aplica el método broadcast.emit en lugar del método emit, ya que, al desconectarse no tiene sentido que el mismo cliente que se desconecta reciba ningun dato.


  1. const http = require("http").createServer(handler),
  2. fs = require("fs"),
  3. io = require("socket.io")(http)
  4. let discEvent = "conexión finalizada"
  5. let name={};
  6. function handler(req,res){
  7. fs.readFile(__dirname+"/index.html", (err,data) => {
  8. if(err) {
  9. res.writeHead(500,{"Content-Type":"text/html"})
  10. return res.send("Error Interno del Servidor")
  11. }else{
  12. res.writeHead(200,{"Content-Type":"text/html"})
  13. return res.end(data,"utf-8")
  14. }
  15. })
  16. }
  17. http.listen(3000,console.log("Servidor corriendo desde el localhost:3000"))
  18. io.on("connection",socket => {
  19. socket.emit("evento",{message: "Bienvenido la conexión ha sido iniciada"})
  20. socket.on("boton",(data) => {
  21. console.log(data)
  22. socket.emit("otro evento", {message: "Botón pulsado"})
  23. })
  24. socket.on("disconnect",() => {
  25. socket.broadcast.emit("desconexion",{discEvent})
  26. })
  27. })
A continuación el archivo html que contiene varios elementos. Este archivo incluye el script (aunque es posible realizarlo desde un archivo externo) que emite un único evento, que se activa al pulsar el botón, y captura los tres eventos que se emiten desde el servidor que recogen los datos  y los muestra en la vista.

  1. <!DOCTYPE HTML>
  2. <html lang="es">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>SocketIO</title>
  7. </head>
  8. <body>
  9. <h1>Comunicación con SocketIO</h1>
  10. <p id="div"></p>
  11. <button id="boton">Emitir evento</button>
  12. <span id="span" style="color:green"></span>
  13. <script src="./socket.io/socket.io.js"></script>
  14. <script>
  15. ((d,io) => {
  16. document.getElementById("boton").addEventListener("click", e => {
  17. e.preventDefault()
  18. io.emit("boton",{name: "Xip",email:"xip@gmail.com"})
  19. return false
  20. })
  21. io.on("evento",data =>{
  22. console.log(data)
  23. d.getElementById("div").textContent = data.message
  24. })
  25. io.on("otro evento", data => {
  26. d.getElementById("span").textContent = data.message
  27. })
  28. io.on("desconexion",data => {
  29. d.getElementById("div").textContent = data.discEvent
  30. })
  31. })(document,io());
  32. </script>
  33. </body>
  34. </html>

INTERCAMBIO DE DATOS CON EXPRESS

A continuación un chat muy básico que se comunica mediante el protocolo websocket utilizando para ello la librería Socket.IO. El servidor se crea con la librería Express en lugar de http (que viene incluida en la instalación de NodeJS) como en los ejemplos anteriores. Este chat lanza una ventana con un mensaje de alerta cada vez que se realiza una nueva conexión o una desconexión y permite mostrar los mensajes de todos los usuarios que se encuentran conectados de forma instantánea.

app.js

  1. const c = console.log,
  2. express = require("express"),
  3. app = express(),
  4. http = require("http").createServer(app),
  5. io = require("socket.io")(http),
  6. port = process.env.PORT || 3000,
  7. publicDir = express.static(`${__dirname}/public`)
  8. app
  9. .use(publicDir)
  10. .get("/",(req,res) => res.sendFile(`${publicDir}/index.html`))
  11. http.listen(port,()=> c(`Iniciando Chat en localhost: ${port}`))
  12. io.on("connection",socket =>{
  13. socket.broadcast.emit("new user",{message:"Ha entrado un usuario al Chat"})
  14. socket.on("new message",message => io.emit("user message",message))
  15. socket.on("disconnect",() => {
  16. let message = "Ha salido un usuario del chat";
  17. c(message)
  18. socket.broadcast.emit("disconnect user",{message});
  19. })
  20. })

index.html

  1. <!DOCTYPE HTML>
  2. <html lang="es">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Chat con Express y Socket.IO</title>
  7. <link rel="stylesheet" href="./style.css">
  8. </head>
  9. <body>
  10. <ul id="chat">
  11. <li>Comentario 1</li>
  12. <li>Comentario 2</li>
  13. <li>Comentario 3</li>
  14. <li>Comentario 4</li>
  15. <li>Comentario 5</li>
  16. </ul>
  17. <form id="chat-form">
  18. <input type="text" id="chat-message" autocomplete="off" required>
  19. <button>Enviar</button>
  20. </form>
  21. <script src="./socket.io/socket.io.js"></script>
  22. <script src="./script.js"></script>
  23. </body>
  24. </html>

script.js

  1. ;
  2. ((d,io)=>{
  3. const chatForm = d.getElementById("chat-form"),
  4. chatMessage = d.getElementById("chat-message"),
  5. chat = d.getElementById("chat")
  6. chatForm.addEventListener("submit", e => {
  7. e.preventDefault();
  8. //io.emit("new user", chatMessage.value)
  9. io.emit("new message",chatMessage.value)
  10. chatMessage.value=null
  11. return false
  12. })
  13. io.on("new user",newUser => alert(newUser.message))
  14. io.on("user message", userMessage => {
  15. //opción 1 creando elementos y añadiendo
  16. //let li = document.createElement("li");
  17. //li.textContent=userMessage;
  18. //chat.append(li);
  19. //opción 2 añadiendo con insertAdjacentHTML
  20. chat.insertAdjacentHTML("beforeend",`<li>${userMessage}li>`)
  21. })
  22. io.on("disconnect user",disconnectUser => {
  23. alert(disconnectUser.message)
  24. })
  25. })(document,io())


Comentarios: 0

Para poder comentar es necesario iniciar sesión



Este dominio utiliza cookies de terceros para crear estadísticas y publicidad personalizada. Si continúa navegando está aceptando su uso