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.
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
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 –
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