2011-10-19 32 views
8

Estoy tratando de hacer que dos clientes (jugadores) se contacten (intercambiando por ejemplo cadenas) a través de socket.io. Tengo este código en los clientes (gameid se define de nuevo en el código):conectando dos clientes con socket.io a través de node.js

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

Si bien en el servidor tengo este (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, entonces cuando los usuarios se conectan utilizan el canal para el intercambio de un mensaje del rey "gameid" que sólo los dos de ellos se puede leer (utilizando el material on.(gameId+"" .... Mi problema es que cuando los jugadores conectar (primero, luego el otro), el primero que se conecta debe alertar a los datos recibidos (porque el segundo que conectado emitió un mensaje). ¿Alguien de ustedes sabe por qué esto no está sucediendo?

Gracias.

Respuesta

10

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

Hay un montón de buena información sobre los usos comunes en su página web, http://socket.io y su cesión temporal, 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 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 
      }); 
     }); 
    }); 
+0

Así que, básicamente, estás diciendo que envío un mensaje a través del canal 'gameId' que llega al servidor y luego al servidor wor ks con eso, ¿estoy en lo cierto? Hasta ahora, no hay "comunicación" entre los clientes, que básicamente no es un "canal". Bien, ok, gracias. Tengo que reestructurar toda mi aplicación. – Masiar

Cuestiones relacionadas