2015-12-03 26 views
7

Próbuję reconnecct gniazdo po wypadku odłączenia jest zwolniony z tego samego socket.id tu jest moje gniazdo configPodłącz gniazdo w przypadku odłączenia

var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var connect_clients = [] //here would be the list of socket.id of connected users 
http.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

Więc na razie rozłączenia chcę podłączyć odłączony użytkownikowi sama socket.id jeśli to możliwe

socket.on('disconnect',function(){ 
var disconnect_id = socket.id; //i want reconnect the users here 
}); 
+0

Wygląda na to, że zakładasz, że 'socket.id' w unikalny sposób identyfikuje użytkownika _user_ zamiast _connection_. Serwer wygeneruje nowy identyfikator dla każdego połączenia (https://github.com/socketio/engine.io/blob/ec673d11f162801b833a516526c1e36fa38f81b6/lib/server.js#L262) i nie można tego zmienić. – robertklep

+0

ok, jeśli to samo socket.id nie można ponownie połączyć Chcę ponownie połączyć je z nowym wygenerowanym identyfikatorem gniazda, następnie –

+0

Domyślnie dla 'socket.io-client' _is_ automatycznie łączy się ponownie (udokumentowane [tutaj] (http://socket.io/ docs/client-api/# manager (url: string, -opts: object)), opcja 'reconnection'. – robertklep

Odpowiedz

6

domyślnie Socket.IO nie posiada server-side logiki na łonie. Oznacza to, że za każdym razem, gdy klient chce się połączyć, tworzony jest nowy obiekt gniazda, dlatego ma nowy identyfikator. To ty musisz wdrożyć ponowne połączenie.

W tym celu potrzebny będzie sposób przechowywania czegoś dla tego użytkownika. Jeśli masz jakiekolwiek uwierzytelnianie (na przykład paszport) - przy użyciu socket.request będziesz mieć uruchomione wstępne żądanie HTTP przed aktualizacją. Stamtąd możesz mieć wszystkie rodzaje plików cookie i dane już zapisane.

Jeśli nie chcesz przechowywać niczego w ciasteczkach, najprościej jest wysłać do klienta szczegółowe informacje o sobie, po połączeniu. Następnie, gdy użytkownik spróbuje ponownie się połączyć, wyślij tę informację ponownie. Coś jak:

var client2socket = {}; 
io.on('connect', function(socket) { 
    var uid = Math.random(); // some really unique id :) 
    client2socket[uid] = socket; 

    socket.on('authenticate', function(userID) { 
     delete client2socket[uid]; // remove the "new" socket 
     client2socket[userID] = socket; // replace "old" socket 
    }); 
}); 

Pamiętaj, to jest tylko przykładowy i trzeba zaimplementować coś trochę lepiej :) Może wysyłać informacje jako wniosek param, lub zapisać go w inny sposób - co działa dla Ciebie.

+0

jak w api klienta daje wiele opcji do ponownego rozpoznania, ale nie byłem w stanie go użyć z powodu złej dokumentacji tego, więc możesz mi pomóc? –

+0

Uhhh, socket.io też ma logikę do ponownego łączenia, więc twój pierwszy akapit wydaje się być całkowicie błędny. – jfriend00

+0

Moja zła, chciałem powiedzieć ** logikę sever-side **. Dzięki za wskazanie tego! –