2011-10-19 34 views
8

Próbuję doprowadzić do kontaktu dwóch klientów (odtwarzaczy) (wymieniając na przykład ciągi) przez socket.io. Mam ten kod na klientach (GameID zdefiniowaną powrotem w kodzie):łączenie dwóch klientów z socket.io poprzez node.js

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

Choć na serwerze mam to (co jest jedną z pierwszych rzeczy zrobić, a nie w routingu oczywiście)

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

Zasadniczo utworzyć kanał, a następnie, gdy użytkownicy łączą one korzystać z kanału do wymiany wiadomości z king „GameID”, że tylko oboje mogą czytać (używając on.(gameId+"" ... rzeczy. Moim problemem jest to, że gdy gracze connect (pierwszy, potem drugi), pierwszy podłączony, powinien ostrzec otrzymane dane (ponieważ drugi to podłączony wyemitował wiadomość). Czy ktoś z was wie, dlaczego tak się nie dzieje?

Dzięki.

Odpowiedz

10

Serwer socket.io powinien działać jak środkowy człowiek. Może odbierać wiadomości od klientów i wysyłać wiadomości do klientów. Nie działa domyślnie jako "kanał", chyba że masz przekazywanie wiadomości od klienta do innych klientów.

Jest wiele dobrych informacji na temat typowych zastosowań na swojej stronie internetowej, http://socket.io i ich repo, https://github.com/LearnBoost/socket.io

Prostym przykładem klienta czatu może być coś takiego:

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" }); 

gdy serwer może działać w ten sposób:

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

Tak więc mówisz, że wysyłam wiadomość przez kanał 'gameId', który dociera do serwera, a następnie serwer ks z tym, czy mam rację? Do tej pory nie ma "komunikacji" między klientami, czyli w zasadzie nie ma "kanału". No ok, dziękuję, muszę zrestrukturyzować całą moją aplikację, niż. – Masiar