CursosEmpresasBlogLiveConfPrecios

Broadcast de eventos

Clase 11 de 26 • Curso de Aplicaciones en Tiempo Real con Socket.io

Clase anteriorSiguiente clase

Contenido del curso

Fundamentos de Socket.io
  • 1
    Cómo hacer aplicaciones en tiempo real

    Cómo hacer aplicaciones en tiempo real

    08:19
  • 2
    Protocolos de comunicación: HTTP vs. WebSockets

    Protocolos de comunicación: HTTP vs. WebSockets

    07:49
  • 3
    ¿Qué es Socket.io?

    ¿Qué es Socket.io?

    03:48
  • 4
    Socket.io vs. WebSockets

    Socket.io vs. WebSockets

    06:00
  • 5
    ¿Cómo funciona Socket.io?

    ¿Cómo funciona Socket.io?

    10:49
  • 6
    Ciclo de vida de Socket.io

    Ciclo de vida de Socket.io

    06:17
Socket.io en la práctica
  • 7
    Creando nuestra primera aplicación con Socket.io

    Creando nuestra primera aplicación con Socket.io

    18:09
  • 8
    Obteniendo información de conexiones en el servidor

    Obteniendo información de conexiones en el servidor

    18:18
  • 9
    Emisión de eventos

    Emisión de eventos

    13:42
  • 10
    On, Once y Off

    On, Once y Off

    16:41
  • 11
    Broadcast de eventos

    Broadcast de eventos

    21:19
  • 12
    Creación de salas con Socket.io

    Creación de salas con Socket.io

    25:43
  • 13
    Namespaces en Socket.io

    Namespaces en Socket.io

    15:54
  • 14
    Lógica de envio de mensajes

    Lógica de envio de mensajes

    12:20
  • 15
    Manejo offline

    Manejo offline

    09:49
  • 16
    Eventos volátiles

    Eventos volátiles

    07:19
  • 17
    Manejo de Middlewares

    Manejo de Middlewares

    12:54
Herramientas extra
  • 18
    Debugging en Socket.io

    Debugging en Socket.io

    11:16
  • 19
    Configuración para testing usando la librería jest

    Configuración para testing usando la librería jest

    16:00
  • 20
    Testing con jest

    Testing con jest

    10:33
  • 21
    Admin UI

    Admin UI

    13:40
Proyecto WebChat
  • 22
    Estructura inicial del proyecto WebChat

    Estructura inicial del proyecto WebChat

    19:25
  • 23
    Sistema de autenticación

    Sistema de autenticación

    17:38
  • 24
    Programando la lógica del chat

    Programando la lógica del chat

    15:38
  • 25
    Detalles finales y demostración de chat en tiempo real

    Detalles finales y demostración de chat en tiempo real

    07:55
Cierre
  • 26
    ¿Quieres un Curso Práctico de Socket.io?

    ¿Quieres un Curso Práctico de Socket.io?

    01:58
    Diego Andres Valderruten Vargas

    Diego Andres Valderruten Vargas

    student•
    hace 3 años
    #circle { position: absolute; top: 50%; left: 50%; display: block; width: 50px; height: 50px; background: #67b8ff; transform: translateX(-50%) translateY(-50%); border-radius: 100%; -webkit-border-radius: 100%; -moz-border-radius: 100%; -ms-border-radius: 100%; -o-border-radius: 100%; -webkit-transform: translateX(-50%) translateY(-50%); -moz-transform: translateX(-50%) translateY(-50%); -ms-transform: translateX(-50%) translateY(-50%); -o-transform: translateX(-50%) translateY(-50%); }
    Fernando Francisco López Mauro

    Fernando Francisco López Mauro

    student•
    hace 3 años

    No mancheeeeees, que chidooo, jajajaja me siento super feliz:D

      Jesus rafael Vasquez ramirez

      Jesus rafael Vasquez ramirez

      student•
      hace 6 días

      ya somos 2 xD

    Carlos Alejandro Hernández Mejía

    Carlos Alejandro Hernández Mejía

    student•
    hace 3 años

    Broadcast de eventos

    Se da cuando se envía un evento a todos los sockets conectados, exceptuando al remitente → socket.broadcast.emit(/* .. */)

    Felipe Escalona

    Felipe Escalona

    student•
    hace 2 años

    Utilizando React.js, tailwind y socketio-client

    import { useState, useEffect, useRef } from 'react'; import './App.css'; import { io } from 'socket.io-client'; function App() { const [position, setPosition] = useState({ top: '50%', left: '50%' }); const socketRef = useRef(); useEffect(() => { socketRef.current = io( " servidor " ); socketRef.current.on("move circle", (newPosition) => { setPosition(newPosition); }); return () => { socketRef.current.disconnect(); }; }, []); const startMoving = (e) => { const move = (e) => { const newPos = { top: `${e.clientY}px`, left: `${e.clientX}px` }; setPosition(newPos); socketRef.current.emit("position", newPos); }; const stopMoving = () => { window.removeEventListener('mousemove', move); window.removeEventListener('mouseup', stopMoving); }; window.addEventListener('mousemove', move); window.addEventListener('mouseup', stopMoving); }; return ( <> <h2>Socket.io a</h2> <div className="absolute bg-blue-400 w-20 h-20 rounded-full cursor-pointer" style={{ top: position.top, left: position.left, transform: 'translate(-50%, -50%)' }} onMouseDown={startMoving} ></div> </> ); } export default App;

    Servidor :

    import express from "express"; import { createServer } from "http"; import { Server } from "socket.io"; const app = express(); const httpServer = createServer(app); const io = new Server(httpServer, { cors: { origin: "*", methods: ["GET", "POST"], }, }); app.get("/", (req, res) => { console.log("hello"); res.send("hello"); }); io.on("connection", (socket) => { socket.on("position", (position) => { console.log(position); socket.broadcast.emit("move circle", position); }); }); httpServer.listen(3000, () => { console.log("listening on localhost:3000"); });
    Carlos Antonio Molano Solarte

    Carlos Antonio Molano Solarte

    student•
    hace 3 años

    To all connected clients except the sender

    io.on("connection", (socket) => { socket.broadcast.emit("hello", "world"); });
    Andrés Esteban Rodríguez Jiménez

    Andrés Esteban Rodríguez Jiménez

    student•
    hace 3 años

    Broadcast de eventos

    El Broadcast de eventos es la capacidad de enviarle un evento a todos los usuarios que estén conectados de la madera que nosotros queramos:

    Veamos un ejemplo de como hacer esto:

    Vamos a empezar de cero y a borrar toda la lógica de los sockets y solo dejar nuestra lógica inicial:

    Luego vamos a crear un div en nuestro html y le vamos a dar forma de circulo con la siguiente hoja de estilos:

    HTML

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="css/style.css"> <title>Servidor con Express y Socket.io</title> </head> <body> <h2>Funciona Uwu</h2> <div id="circle"></div> <script src="/socket.io/socket.io.js"></script> <script src="./js/index.js"></script> </body> </html>

    CSS

    #circle { position: absolute; top: 50%; left: 50%; display: block; width: 50px; height: 50px; background: #67b8ff; transform: translateX(-50%) translateY(-50%); border-radius: 100%; -webkit-border-radius: 100%; -moz-border-radius: 100%; -ms-border-radius: 100%; -o-border-radius: 100%; -webkit-transform: translateX(-50%) translateY(-50%); -moz-transform: translateX(-50%) translateY(-50%); -ms-transform: translateX(-50%) translateY(-50%); -o-transform: translateX(-50%) translateY(-50%); }

    Con el código anterior, deberíamos tener un circulito azul en la mitad de la pantalla, supongamos que queremos manipular este circulito y arrastrarlo cuando lo presionemos:

    Ahora vamos a nuestro archivo index.js del lado del cliente y hacemos esto rápidamente:

    const socket = io() const circle = document.querySelector('#circle') // mover circulo const drag = (e) => { const clientX = e.clientX const clientY = e.clientY circle.style.top = clientY + 'px' circle.style.left = clientX + 'px' } // se mueve cuando el mouse este presionado document.addEventListener('mousedown', (e) => { document.addEventListener('mousemove', drag) }) // se deja de mover cuando se levante el mouse document.addEventListener('mouseup', (e) => { document.removeEventListener('mousemove', drag) })

    Listo, ahora vamos a hacer algo mucho más interesante, VAMOS A MOVER EL CIRCULITO EN TIEMPO REAL. Chan chan chan…

    Para esto vamos a hacer una pequeña modificación del código anterior en el cliente.

    const socket = io() const circle = document.querySelector('#circle') // mover circulo const drag = (e) => { const clientX = e.clientX const clientY = e.clientY // enviamos la posición al servidor socket.emit('circle-position', { top: clientY + 'px', left: clientX + 'px' }) } // se mueve cuando el mouse este presionado document.addEventListener('mousedown', (e) => { document.addEventListener('mousemove', drag) }) // se deja de mover cuando se levante el mouse document.addEventListener('mouseup', (e) => { document.removeEventListener('mousemove', drag) }) // recibimos la posición del servidor y la usamos socket.on('move-circle', position => { circle.style.top = position.top circle.style.left = position.left })

    Ahora vamos a nuestro servidor y creamos la siguiente lógica:

    // recibimos la posición del círculo en el navegador y la enviamos al cliente io.on('connection', socket => { socket.on('circle-position', (position) => { io.emit('move-circle', position) }) })

    Y listo, si abrimos dos navegadores e intentamos mover el circulo, veremos que lo podemos hacer em ambos navegadores.

    Pero, digamos que queremos hacer un juego en el cual, aunque se caiga el servidor, el usuario pueda mover el circulo dentro de su propio navegador, evidentemente no se haría en tiempo real pero al menos el usuario podría mover su circulo en su navegador, ya que actualmente, si el servidor se cae, no podrá hacerlo debido a que el servidor es el que devuelve la posición del circulo, y si no hay servidor, no hay posición del circulo que nos retorne. Veamos como arreglar esto:

    Para esto, lo primero que debemos hacer es que en el cliente no dependamos del servidor para que nos regrese la posición, sino que lo hagamos directamente desde un objeto:

    const socket = io() const circle = document.querySelector('#circle') // creamos una función que almacene las posiciones const drawCircle = (position) => { circle.style.top = position.top circle.style.left = position.left } // mover circulo const drag = (e) => { // guardamos la posición en un objeto const position = { top: e.clientY + 'px', left: e.clientX + 'px' } // dibujamos el circulo individualmente drawCircle(position) // enviamos la posición al servidor socket.emit('circle-position', position) } // se mueve cuando el mouse este presionado document.addEventListener('mousedown', (e) => { document.addEventListener('mousemove', drag) }) // se deja de mover cuando se levante el mouse document.addEventListener('mouseup', (e) => { document.removeEventListener('mousemove', drag) }) // recibimos la posición del servidor y la usamos socket.on('move-circle', (position) => { drawCircle(position) })

    Ahora en el servidor cambiamos el método **emit** por el método socket.broadcast.emit:

    // va a emitir el evento a todos los clienetes conectados, menos a mi // con eso no dependo del servidor para usar mi información io.on('connection', socket => { socket.on('circle-position', (position) => { socket.broadcast.emit('move-circle', position) }) })

    De acuerdo al broadcast y a la lógica que requiera nuestra aplicación, podemos hacer que envié la emisión a todos incluido a mi, o a todos menos a mi.

    Esto nos puede servir para un juego en línea o un chat.

    Emilio Sala

    Emilio Sala

    student•
    hace 3 meses

    Ventajas de este patrón:

    • Sin retraso para el usuario local: ve su acción en tiempo real.
    • Sin desincronización para otros: el servidor sigue siendo la fuente de verdad.
    • Aísla la lógica: cada cliente sabe qué hacer cuando recibe datos.
    Juan Camilo Zúñiga Sandoval

    Juan Camilo Zúñiga Sandoval

    student•
    hace 4 meses

    En algunas versiones de node es necesario escuchar el evento mouseup para que no se siga ejecutando el evento mousemove de la siguiente manera:

    const stopDrag = () =>{ document.removeEventListener("mousemove",drag); document.addEventListener("mouseup", stopDrag);} document.addEventListener("mousedown", e =>{ document.addEventListener("mousemove", drag); document.addEventListener("mouseup", stopDrag);})

    Jose Ever Muñoz Muñoz

    Jose Ever Muñoz Muñoz

    student•
    hace 8 meses

    Esta clase esta demasiado buena !

    Jhon Jairo Castiblanco Mojica

    Jhon Jairo Castiblanco Mojica

    student•
    hace 8 meses

    La diferencia entre io.on y socket.broadcast es fundamental en Socket.io. io.on se usa para manejar eventos a nivel de servidor y se activa cuando un cliente se conecta, permitiendo gestionar eventos generales. Por otro lado, socket.broadcast se utiliza para enviar mensajes a todos los demás sockets conectados, excluyendo al socket que envía el mensaje. Esto es útil para notificaciones que no deben ser recibidas por el emisor.

    Cristian Camilo Cortes Ortiz

    Cristian Camilo Cortes Ortiz

    student•
    hace un año

    BROADCAST DE EVENTOS

    La difusión (broadcast) de eventos en Socket.io permite enviar mensajes a todos los clientes conectados, excepto al emisor. Utilizando el método broadcast, los eventos pueden ser emitidos a múltiples clientes simultáneamente. Por ejemplo, al emitir un evento desde el servidor con socket.broadcast.emit('event', data), el mensaje se enviará a todos los clientes conectados, excepto al que originó la emisión. Esta funcionalidad es especialmente útil en aplicaciones que requieren la actualización simultánea de varios usuarios, como en chats grupales, juegos multijugador y aplicaciones de colaboración en tiempo real, asegurando que todos los usuarios reciban información consistente y actualizada sin afectar al emisor.

    Miguel Negron Garcia

    Miguel Negron Garcia

    student•
    hace 2 años

    Waoo, me encanto muchisimo esta clase. Aprendí algo muy útil y se me ocurren muchas posibilidades con websocket ahora. Antes pensaba que Websocket solo tenia sentido para redes sociales pero ahora veo que incluso por ejemplo un trello puede usar websocket.

      Diego Reyes Cabrera

      Diego Reyes Cabrera

      student•
      hace 2 años

      Notion usa sockets, también Asana, Google Calendar... es muy probable que los usemos en nuestro trabajo en cierto momento

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads