webentwicklung-frage-antwort-db.com.de

Node.js: socket.io schließt die Clientverbindung

Wie kann ich die Socketverbindung auf der Clientseite schließen?

Ich benutze: 

  • socket.io 0,9
  • node.js 0.10.15
  • ausdrücke 3.3.4

d.:call localhost/test
-- Serverseite

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

- Client-Seite

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

Wenn ich die Testseite lade, benötige ich einige Werte vom Server (getInitData).
Beim ersten Seitenbesuch bekomme ich die Daten einmal, beim erneuten Laden oder beim zweiten Besuch bekomme ich sie zweimal und so weiter. 

Die Verbindung auf der Serverseite wird automatisch geschlossen, wenn die Seite neu geladen wird und wenn Sie die Seite verlassen.
Auf der Clientseite ist die Verbindung jedoch noch offen.
Wie kann ich die Verbindung auf der Clientseite schließen oder überprüfen, ob bereits eine Verbindung besteht?

UPDATE
Ich habe nun folgendes ausprobiert: (Client-Seite)

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

Dies löst auf Clientseite das Disconnect-Ereignis aus, aber ich bekomme immer noch die doppelte oder dreifache Antwort.

37
baam

Es gibt keine Verbindung auf Server- und/oder Browserseite. Es gibt nur eine Verbindung. Wenn eine der Seiten die Seite schließt, wird sie geschlossen (und Sie können keine Daten auf eine Verbindung pushen, die offensichtlich geschlossen ist).

Nun schließt ein Browser die Verbindung, wenn Sie die Seite verlassen (dies hängt nicht von der Bibliothek/Sprache/dem Betriebssystem ab, die Sie auf der Server-Seite verwenden). Dies gilt zumindest für WebSockets (bei keep-alive trifft dies möglicherweise nicht für lange Abfragen zu, aber hoffentlich erledigt socket.io dies richtig).

Wenn so ein Problem auftritt, bin ich ziemlich sicher, dass in Ihrem eigenen Code ein Fehler vorliegt (auf der Serverseite). Möglicherweise stapeln Sie einige Event-Handler, wo Sie nicht sollten.

9
freakish

Hast du versucht: 

socket.disconnect() 

auf dem Client?

62
Milan Babuškov

Für Socket.io Version 1.4.5:

Auf dem Server:

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

Auf kunden:

var io = io();
io.emit('end');
17
Himani Agrawal
socket.disconnect()

Startet das Verbindungsauslösungsereignis nur auf Clientseite neu. Wird aber wieder verbunden.

socket.close()

Trennen Sie die Verbindung vom Client. Der Client versucht weiterhin, eine Verbindung herzustellen.

7
Ali Azhar

socket.disconnect() ist ein Synonym zu socket.close(), das den Socket manuell trennt.

Wenn Sie clientseitig eingeben:

const socket = io('http://localhost');

dies öffnet eine Verbindung mit autoConnect: true, daher versucht die lib, die Verbindung erneut herzustellen, wenn Sie den Socket vom Server trennen, um die automatische Verbindung zu deaktivieren:

const socket = io('http://localhost', {autoConnect: false});
socket.open();// synonym to socket.connect()

Und wenn Sie möchten, können Sie die Verbindung manuell wiederherstellen:

socket.on('disconnect', () => {
  socket.open();
});
3
Ahmad Zahabi

Ich versuche die Benutzerverbindung in Version 1.0 zu schließen und habe diese Methode gefunden:

socket.conn.close()

Der Unterschied zwischen dieser Methode und disconnect () besteht darin, dass der Client weiterhin versucht, die Verbindung zum Server wiederherzustellen.

2
JakubKnejzlik

Versuchen Sie einfach socket.disconnect(true) auf der Serverseite, indem Sie ein Ereignis von der Clientseite aus senden.

0
Lalit Kumar

versuchen Sie dies, um die Verbindung zu schließen:

socket.close();

und wenn Sie es wieder öffnen wollen:

socket.connect();
0
Luis Fletes