it-swarm.com.de

erzwingen Sie das Trennen der Clientverbindung vom Server mit socket.io und nodejs

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?

104
Daniel Kenney

Edit: Das ist jetzt möglich

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

Meine ursprüngliche Antwort:

Das ist noch nicht möglich.

Wenn Sie es auch brauchen, bewerten/kommentieren Sie diese Ausgabe .

124
nh2

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

Client.emit('disconnect') löst das Verbindungsabbruchereignis 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 zum Server zu trennen?

16
Fabien

Gibt es einen Grund, warum der Server keine Nachricht an den Client senden kann, durch die er die Unterbrechungsfunktion aufruft?

Auf kunden:

socket.emit('forceDisconnect');

Auf dem Server:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});
8
quahada

Angenommen, Sie benennen den Sockel Ihres Sockels:

socket.disconnect()
4
Erik

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

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

4
Sascha Gehlich

In meinem Fall wollte ich die zugrunde liegende Verbindung abreißen. In diesem Fall musste ich socket.disconnect(true) anrufen, da Sie in der source hier sehen können .

3
Duncan

Wenn Sie heute Morgen nachsehen, ist es anscheinend jetzt:

socket.close()

https://socket.io/docs/client-api/#socket-close

2
HAS-Jack

client._onDisconnect() sollte funktionieren

2
Emmerman

Dieses hat nicht funktioniert für mich: 

`socket.disconnect()` 

Dieses hat gearbeitet für mich: 

socket.disconnect(true)

Durch die Übergabe von true wird die darunterliegende Verbindung zum Client geschlossen und nicht nur der Namespace, mit dem der Client verbunden ist, mit Socket IO Documentation .


Ein Anwendungsbeispiel: Der Client stellte eine Verbindung zum Web-Socket-Server mit ungültigem Zugriffstoken her (Zugriffstoken, das an den Web-Socket-Server mit Verbindungsparametern übergeben wird). Der Web-Socket-Server benachrichtigt den Client aufgrund seines ungültigen Zugriffstokens darüber, dass er die Verbindung trennen 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');
// });
1
Bem

Socket.io verwendet das EventEmitter-Muster, um Heartbeats zu trennen, zu verbinden oder zu überprüfen. Client.emit('disconnect');

1

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

0
skyman

benutzen :

socket.Disconnect () // ok

verwende nicht :

socket.disconnect ()

0
m-tech

Ich benutze auf der Clientseite socket.disconnect(); 

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