es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Socket.io emit sólo funciona para un usuario?

Estoy intentando implementar socket.io en una aplicación de React. He seguido la documentación, sin embargo, estoy teniendo problemas para hacer que ‘dos ventanas del navegador’ o ’emular dos dispositivos’ se comuniquen entre sí.

La implementación que tengo está funcionando, sin embargo, cuando emito un cambio al servidor, solo se está detectando en la ventana o dispositivo que realizó el cambio, y los demás clientes no ven el cambio.

¿Alguien puede decirme dónde me equivoco y cómo puedo hacer que los cambios sean detectados por los otros clientes?

server.js

const server = require(“http”).createServer();
const io = require(“socket.io”)(server, {
cors: {
origin: “*”
}
});

io.on(‘connection’, socket => {
console.log(‘Usuario conectado:’ + socket.id);

socket.on('child-login', (data) => {
    console.log(data);
    console.log(socket.id);
    socket.emit('child-login', data);
})

});

server.listen(3001, () => {
console.log(‘Servidor ejecutándose….’)
});

react component js

import api from “../utilities/api”;
import { useState } from “react”;

import { io } from ‘socket.io-client’;

const socket = io(‘http://localhost:3001’);

socket.on(‘child-login’, (data) => {
document.querySelector(‘.js-last-login’).innerHTML = data;
});

function Dashboard() {

const loginChild = e => {
    e.preventDefault();
    let self = e.target;
    socket.emit('child-login', e.target.innerHTML);
}

return (
   <div>
        <ul>
            <li>
                <a onclick="{loginChild}">Walter Melon</a>
            </li>
            <li>
                <a onclick="{loginChild}">Teri Dactyl</a>
            </li>
        </ul>
       <h1 classname="js-last-login"></h1>
   </div>
);

}

export default Dashboard;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que tienes la configuración básica de socket.io en tu aplicación React. Para que los cambios sean recogidos por los demás clientes, tienes que asegurarte de que socket.emit es llamado en el lado del servidor.

    Puedes hacer esto añadiendo un socket.broadcast.emit en tu callback io.on(‘connection’). Esto emitirá los datos a todos los clientes conectados, en lugar de sólo al que hizo el cambio.

    Por ejemplo:

    io.on('connection', socket => {
        console.log('User Connected:' + socket.id);
    
        socket.on('child-login', (data) => {
            console.log(data);
            console.log(socket.id);
            socket.emit('child-login', data);
            socket.broadcast.emit('child-login', data);
        })
    });
    

    Esto debería asegurarse de que los cambios son recogidos por todos los clientes conectados.

Comments are closed.