il collegamento di due clienti con socket.io attraverso node.js
Domanda
che sto cercando di fare due clienti (giocatori) contatto tra loro (ad esempio lo scambio di stringhe) attraverso socket.io. Ho questo codice sui client (GameID è definito nel codice):
var chat = io.connect('http://localhost/play');
chat.emit(gameId+"", {
guess: "ciao"
});
chat.on(gameId+"", function (data) {
alert(data.guess);
});
Mentre sul server ho questo (che è una delle prime cose che faccio, non in instradamento ovviamente)
var messageExchange = io
.of('/play')
.on('connection', function (socket) {
socket.emit('message', {
test: 'mex'
});
});
In pratica creo il canale, poi, quando gli utenti si connettono usano il canale per lo scambio di un messaggio del re "GameID" che solo i due di essi può leggere (utilizzando la roba on.(gameId+"" ...
.
Il mio problema è che quando i giocatori si collegano (prima uno, poi l'altro), il primo che collegava dovrebbe avvertire i dati ricevuti (in quanto il secondo che collegavano emesso un messaggio). Qualcuno di voi sa perché questo non sta accadendo?
Grazie.
Soluzione
Il server socket.io dovrebbe agire come un uomo di mezza. Si può ricevere messaggi da parte dei clienti e inviare messaggi ai clienti. Non agire come un "canale" per impostazione predefinita, se non avete i messaggi Relay Server da clienti ad altri clienti.
C'è un sacco di buone informazioni su usi comuni sul loro sito web, http://socket.io e loro pronti contro termine, https://github.com/LearnBoost/socket.io
Un semplice esempio di un client di chat potrebbe essere qualcosa di simile:
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" });
Mentre il server potrebbe agire in questo modo:
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
});
});
});