Pregunta

Estoy tratando de hacer que dos clientes (jugadores) se comuniquen entre sí (intercambiando por ejemplo cadenas) a través de Socket.io. Tengo este código en los clientes (GameId se define en el código):

var chat = io.connect('http://localhost/play');
chat.emit(gameId+"", {
    guess: "ciao"
});
chat.on(gameId+"", function (data) {
    alert(data.guess);
});

Mientras que en el servidor tengo esto (que es una de las primeras cosas que hago, no en el enrutamiento, por supuesto)

var messageExchange = io
    .of('/play')
    .on('connection', function (socket) {
        socket.emit('message', {
            test: 'mex'
        });
      });

Básicamente, creo el canal, luego, cuando los usuarios se conectan, usan el canal para intercambiar un mensaje del rey "GameID" que solo los dos pueden leer (usando el on.(gameId+"" ... cosas. Mi problema es que cuando los jugadores se conectan (primero uno, luego el otro), el primero que conectó debe alertar los datos recibidos (porque el segundo que conectó emitió un mensaje). ¿Alguien de ustedes sabe por qué esto no está sucediendo?

Gracias.

¿Fue útil?

Solución

El servidor Socket.io debe actuar como un intermediario. Puede recibir mensajes de los clientes y enviar mensajes a los clientes. No actúa como un "canal" de forma predeterminada, a menos que tenga los mensajes de retransmisión del servidor de los clientes a otros clientes.

Hay mucha buena información sobre usos comunes en su sitio web, http://socket.io y su repositorio, https://github.com/learnboost/socket.io

Un ejemplo simple de un cliente de chat podría ser algo como esto:

var chat = io.connect("/play");
var channel = "ciao";

// When we connect to the server, join channel "ciao"
chat.on("connect", function () {
    chat.emit("joinChannel", {
        channel: channel
    });
});

// When we receive a message from the server, alert it
// But only if they're in our channel
chat.on("message", function (data) {
    if (data.channel == channel) {
        alert(data.message);
    }
});

// Send a message!
chat.emit("message", { message: "hola" });

Mientras que el servidor podría actuar así:

var messageExchange = io
    .of('/play')
    .on('connection', function (socket) {
        // Set the initial channel for the socket
        // Just like you set the property of any
        // other object in javascript
        socket.channel = "";

        // When the client joins a channel, save it to the socket
        socket.on("joinChannel", function (data) {
            socket.channel = data.channel;
        });

        // When the client sends a message...
        socket.on("message", function (data) {
            // ...emit a "message" event to every other socket
            socket.broadcast.emit("message", {
                channel: socket.channel,
                message: data.message
            });
        });
     });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top