2013-08-08 17 views
30

Jak mogę zamknąć połączenie z gniazdem po stronie klienta?Node.js: socket.io zamknij połączenie klienta

Używam:

  • socket.io 0,9
  • node.js 0.10.15
  • wyrazić 3.3.4

IE: wezwanie localhost/test
- serwer strona

var test = io 
.of('/test') 
.on('connection', function (socket) { 

    console.log('open socket: ' + socket); 

    socket.on('disconnect', function() { 
    console.log('disconnected event'); 
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side 
    //socket.disconnect(); --> same here 
    }); 
}); 

- po stronie klienta

var socket = io.connect('http://localhost:3000/test'); 
socket.on('disconnect', function() { 
    console.log('disconnect client event....'); 
}); 

socket.emit('getInitData', function (data) { 
    .. do something with data 
}); 

Gdybym załadować stronę testową Potrzebuję wartości z serwera (getInitData).
Podczas pierwszej wizyty strony otrzymuję dane jeden raz, po ponownym załadowaniu lub drugiej wizycie otrzymuję je dwa razy i tak dalej.

Połączenie po stronie serwera jest automatycznie zamykane po ponownym wczytaniu strony i po opuszczeniu strony.
Ale po stronie klienta połączenie jest nadal otwarte.
Jak mogę zamknąć połączenie po stronie klienta lub sprawdzić, czy jest już otwarte połączenie?

UPDATE
Próbowałem teraz następujący: (po stronie klienta)

window.onbeforeunload = function(e) { 
    socket.disconnect(); 
}; 

To wyzwala po stronie klienta, termin rozłączyć, ale nadal pojawia się dwukrotnie lub potrójne odpowiedź.

+0

Jak radzicie sobie 'imprezy getInitData'? –

+0

'getInitData' zwraca niektóre wartości z mojego napisanego addonu węzła. te wartości są ustawiane w formularzu (pole wyboru, pole tekstowe itp.) , ale właśnie się dowiedziałem, że połączenie na serwerze jest uruchamiane wiele razy. Za każdym razem, gdy ponownie ładuję stronę, nowe połączenie jest dodawane, mimo że połączenie jest zamykane. – baam

+1

Nie ma czegoś takiego jak połączenie po stronie serwera i przeglądarki. Jest tylko jedno połączenie. Jeśli jedna ze stron go zamknie, zostanie zamknięta (i nie można przekazać danych do połączenia, które jest oczywiście zamknięte). Teraz przeglądarka zamyka połączenie po opuszczeniu strony (nie zależy to od używanej biblioteki), co jest prawdą w przypadku WebSockets. Jeśli pojawi się taki problem, to jestem pewien, że jest błąd we własnym kodzie (po stronie serwera). Możliwe, że układasz kilka programów obsługi zdarzeń tam, gdzie nie powinieneś. – freakish

Odpowiedz

7

Nie ma czegoś takiego jak połączenie po stronie serwera i/lub przeglądarki. Jest tylko jedno połączenie. Jeśli jedna ze stron go zamknie, zostanie zamknięta (i nie można przekazać danych do połączenia, które jest oczywiście zamknięte).

Teraz przeglądarka zamyka połączenie po opuszczeniu strony (nie zależy to od biblioteki/języka/systemu operacyjnego, którego używasz po stronie serwera). Jest to co najmniej prawdziwe dla WebSockets (może to nie być prawda dla długiego sondowania z powodu keep-alive, ale mam nadzieję, że socket.io obsługuje to poprawnie).

Jeśli pojawi się taki problem, to jestem pewien, że jest błąd we własnym kodzie (po stronie serwera). Możliwe, że układasz kilka programów obsługi zdarzeń tam, gdzie nie powinieneś.

+7

*" Jeśli jedna ze stron zamyka go, a następnie zamyka "* - jak zamknąć programowo z każdej strony ..?Nie mogłem znaleźć żadnej dokumentacji –

57

Próbowałaś:

socket.disconnect() 

na klienta?

+0

Nie, nie zrobiłem. Myślałem, że to po prostu wywoła zdarzenie rozłączenia po stronie serwera? I kiedy mam to uruchomić? – baam

+0

Tęsknię za tym w pytaniu, ale kiedy chcesz zamknąć połączenie na kliencie? –

+0

Za każdym razem, gdy połączenie z serwerem jest zamykane. (przeładuj/odśwież i rozładuj/opuść stronę) – baam

1

Próbuję zamknąć połączenie użytkowników w wersji 1.0 i znaleźć tę metodę:

socket.conn.close() 

Różnica między tą metodą i odłączać() jest to, że klient będzie próbował ponownie połączyć się z serwerem.

0

spróbować tego, aby zamknąć połączenie:

socket.close(); 

a jeśli chcesz go otworzyć ponownie:

socket.connect(); 
5
socket.disconnect() 

Tylko restartuje zdarzenie rozłączania połączenia wypalania na stronie klienta. Ale znowu się połączy.

socket.close() 

Odłącz połączenie od klienta. Klient będzie nadal próbował się połączyć.

0

Po prostu spróbuj socket.disconnect(true) po stronie serwera, emitując dowolne zdarzenie po stronie klienta.

+0

Co powinien zrobić prawdziwy argument? – netpoetica

13

Dla socket.io wersji 1.4.5:

na serwerze:

socket.on('end', function(){ 
    socket.disconnect(0); 
}); 

Na kliencie:

var io = io(); 
io.emit('end'); 
+0

Witam. Działa, dzięki. Ale czy usuwa także użytkownika z tablicy połączonych użytkowników? – user3304007

+0

Należy usunąć, ale nie jestem pewien. Próba drukowania tablicy użytkowników po zamknięciu połączenia. –

+0

Gotowe. Jak mogę wydrukować tablice użytkowników? Wcześniej używałam tego do usuwania odłączonego użytkownika. usuń użytkowników [socket.nickname] – user3304007