Erzwingen Sie die Trennung des Clients vom Server mit socket.io und nodejs

116

Gibt es eine Möglichkeit, einen Client mit SocketIO zu trennen und die Verbindung buchstäblich zu schließen? Wenn also jemand mit meinem Server verbunden ist und ich die Verbindung zwischen ihm und meinem Server schließen möchte, wie würde ich das tun?

Daniel Kenney
quelle

Antworten:

145

Bearbeiten: Dies ist jetzt möglich

Sie können jetzt einfach socket.disconnect()auf der Serverseite anrufen .

Meine ursprüngliche Antwort:

Dies ist noch nicht möglich.

Wenn Sie es auch brauchen, stimmen Sie zu diesem Thema ab .

nh2
quelle
Also mache ich das und es zwingt den Client, die Verbindung zu trennen. Leider scheint es, dass der Client die Verbindung einfach sofort wieder herstellt. Verstehe ich falsch, was los ist, oder ist das das erwartete Verhalten?
Kybernetikos
@kybernetikos Ja, das würde ich erwarten - der Kunde kann schließlich entscheiden, was er mit seinem eigenen machen möchte. Oft möchten Sie die andere Seite von der aktuellen Verbindung trennen , beispielsweise aufgrund eines Zeitlimits für die Authentifizierung - eine erneute Verbindung danach wäre wahrscheinlich sogar wünschenswert.
nh2
Kennen Sie also eine Möglichkeit, dem Kunden zu sagen, dass er weggehen soll und ich meine es wirklich so? Ich denke unter dem Gesichtspunkt, festzustellen, dass sich ein Client schlecht verhält und nicht möchte, dass er Ressourcen auf meinem Server verbraucht.
Kybernetikos
@kybernetikos Nein, das kannst du (im Allgemeinen) nicht. Wenn Sie die Clientseite programmieren, können Sie natürlich jede gewünschte Logik implementieren, z. B. verhindern, dass die Verbindung wiederhergestellt wird. Wenn nicht, müssen Sie die Benutzer wiederholt treten oder, falls dies wirklich erforderlich ist, auf Standard-Blockiertechniken zurückgreifen. iptablesJe niedriger diese implementiert sind (z. B. ), desto mehr Ressourcen sparen Sie. In den meisten Fällen sollte es jedoch ausreichen, nur den Client zu treten, da Socketio keine so schnelle Verbindung herstellt und wenn jemand Sie wirklich tun möchte, hat er sowieso andere Möglichkeiten (z. B. das Herunterladen von Seiten von Ihnen).
nh2
1
@ManishSapkal Du solltest wahrscheinlich eine neue Frage dafür öffnen, sie passt nicht gut in Kommentare.
nh2
15

socket.disconnect() kann nur auf der Clientseite verwendet werden, nicht auf der Serverseite.

Client.emit('disconnect')Löst das Trennungsereignis auf dem Server aus, trennt den Client jedoch nicht effektiv. Dem Client ist die Trennung nicht bekannt.

Es bleibt also die Frage: Wie kann ein Client gezwungen werden, die Verbindung zur Serverseite zu trennen?

Fabien
quelle
1
Client.emit('disconnect')Mit den neuesten Versionen von socket.io müssen Sie nicht mehr manuell anrufen, es gibt jetzt eine serverseitige Version socket.disconnect()(siehe meine Antwort).
nh2
5
Aufgrund der letzten Updates ist Ihre Antwort jetzt falsch, daher die -1.
Corazza
Ich stimme zu, diese Antwort ist nicht mehr gültig, da sie jetzt socket.disconnect()auch auf der Serverseite verwendet werden kann.
Vassilis Barzokas
@VassilisBarzokas Was ist, wenn ich einen Rückruf möchte und nach disconnect()Beendigung der Funktion einige Parameter an den Rückruf übergebe ?
Newguy
Erstellen Sie einen vereinbarten Satz von Nachrichten, in denen eine Partei die andere Partei darüber informiert, dass sie die Verbindung trennen möchte, dann tun, was Sie tun müssen, und dann tatsächlich die Verbindung trennen.
Mike 'Pomax' Kamermans
8

Gibt es einen Grund, warum der Server keine Nachricht an den Client senden kann, die ihn dazu bringt, die Trennungsfunktion aufzurufen?

Auf Client:

socket.emit('forceDisconnect');

Auf dem Server:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
Quahada
quelle
7
Weil man sich niemals darauf verlassen kann, dass clientseitiger Code genau so funktioniert, wie Sie es möchten. Benutzer können es leicht ändern.
Kaustubh Karkare
4

Angenommen, der Socket Ihres Sockets heißt:

socket.disconnect()
Erik
quelle
2
Das funktioniert leider nicht. Ich versuche, die Verbindung zu einem bestimmten Client von der Serverseite aus zu schließen.
Daniel Kenney
4

Für diejenigen, die dies bei Google gefunden haben - es gibt momentan eine Lösung dafür:

Socket.disconnect()tritt den Client (serverseitig). Keine Chance für den Kunden, in Verbindung zu bleiben :)

Sascha Gehlich
quelle
Wie finde ich den Socket eines Benutzers, der auf dem Server nicht verbunden ist?
Manish Sapkal
Manish: Warten Sie auf das disconnectEreignis des Sockets, um herauszufinden, ob die Verbindung getrennt wurde. Kann auch die closeVeranstaltung sein, da bin ich mir nicht ganz sicher. Weitere Informationen hierzu finden Sie in der Dokumentation zu socket.io.
Sascha Gehlich
3

In meinem Fall wollte ich die zugrunde liegende Verbindung abbrechen. In diesem Fall musste ich anrufen, socket.disconnect(true)wie Sie sehen können, wird von der Quelle hier benötigt

Duncan
quelle
2

client._onDisconnect() sollte arbeiten

Emmerman
quelle
1
Dies funktioniert perfekt. Ich
pflege
1

Socket.io verwendet das EventEmitter-Muster, um Herzschläge zu trennen / zu verbinden / zu überprüfen, damit Sie dies tun können. Client.emit('disconnect');

Anthony Wlodarski
quelle
1

Das hat bei mir nicht funktioniert :

`socket.disconnect()` 

Das hat bei mir funktioniert :

socket.disconnect(true)

Durch die Übergabe truewird die zugrunde liegende Verbindung zum Client geschlossen und nicht nur der Namespace, mit dem der Client mit der Socket IO-Dokumentation verbunden ist .


Ein Anwendungsbeispiel: Der Client hat eine Verbindung zum Web-Socket-Server mit ungültigem Zugriffstoken hergestellt (Zugriffstoken, das mit Verbindungsparametern an den Web-Socket-Server übergeben wurde). Der Web-Socket-Server benachrichtigt den Client, dass die Verbindung aufgrund seines ungültigen Zugriffstokens geschlossen wird:

// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
    console.log(data);       // (4) server receives 'invalidAccessTokenEmitReceived' from client
    socket.disconnect(true); // (5) force disconnect client 
});

// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => { 
//     // (3) the client ack emits to server
//     fn('invalidAccessTokenEmitReceived');
// });
Baran Emre
quelle
0

Ich verwende client.emit('disconnect')+ client.removeAllListeners()für einen verbundenen Client, um alle Ereignisse nach dem Trennen der Verbindung zu ignorieren

Himmelmann
quelle
0

Ich benutze auf der Client-Seite socket.disconnect();

client.emit('disconnect') didnt work for me
Yonia
quelle
0

verwenden :

socket.Disconnect () // ok

verwende nicht :

socket.disconnect ()

m-tech
quelle
0

Sie können socket = undefinedlöschen, welche Buchse Sie angeschlossen haben. Wenn Sie also eine Verbindung herstellen möchten, tun Sie Socket (URL)

So wird es also aussehen

const socketClient = require('socket.io-client');

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;
Saurabh Gupta
quelle
-1

Fügen Sie einem Array neue Socket-Verbindungen hinzu, und wenn Sie alle schließen möchten, durchlaufen Sie sie und trennen Sie die Verbindung. (Serverseite)

var socketlist = [];

   io.sockets.on('connection', function (socket) {
        socketlist.push(socket);  
        //...other code for connection here..
   });


    //close remote sockets
    socketlist.forEach(function(socket) {        
        socket.disconnect();                      
    });    
PodTech.io
quelle