soket.io ve nodejs ile istemcinin sunucudan bağlantısını kesmeye zorlama


117

SocketIO ile bir istemcinin bağlantısını kesmenin ve bağlantıyı tam anlamıyla kapatmanın bir yolu var mı? Öyleyse birisi sunucuma bağlıysa ve ben onunla sunucum arasındaki bağlantıyı kapatmak istersem, bunu nasıl yapabilirim?

Yanıtlar:


146

Düzenleme: Bu artık mümkün

Artık socket.disconnect()sunucu tarafında arama yapabilirsiniz .

Orijinal cevabım:

Bu henüz mümkün değil.

Buna da ihtiyacınız varsa, bu konuda oy verin / yorum yapın .


Bunu yapıyorum ve müşteriyi bağlantıyı kesmeye zorluyor, maalesef müşteri hemen yeniden bağlanıyor gibi görünüyor. Neler olduğunu yanlış mı anlıyorum yoksa beklenen davranış bu mu?
kybernetikos

@kybernetikos Evet, bunu bekliyorum - müşteri sonuçta ne yapacağını kendisi seçebilir. Çoğu zaman, diğer tarafı mevcut bağlantıdan atmak istersiniz , örneğin bir kimlik doğrulama zaman aşımı nedeniyle - bundan sonra yeniden bağlantı muhtemelen istenebilir.
nh2

Öyleyse müşteriye 'git ve gerçekten ciddiyim' demenin herhangi bir yolunu biliyor musun? Bir istemcinin kötü davrandığını ve sunucumdaki kaynakları kullanmasını istemediğini belirleme bakış açısından düşünüyorum.
kybernetikos

@kybernetikos Hayır, bunu yapamazsınız (genellikle). Yine de istemci tarafını programlıyorsanız, elbette istediğiniz herhangi bir mantığı uygulayabilirsiniz, örneğin yeniden bağlanmasını durdurabilirsiniz. Değilse, kullanıcıları defalarca tekmelemek veya gerçekten gerekliyse standart engelleme tekniklerine başvurmak zorunda; bunlar ne kadar düşük seviyede uygulanırsa (örneğin iptables), o kadar çok kaynak tasarrufu yaparsınız. Çoğu durumda, sadece müşteriyi tekmelemek yeterli olacaktır, çünkü socketio o kadar hızlı bağlanmaz ve eğer birisi sizi gerçekten DoS yapmak istiyorsa, yine de başka yolları vardır (örneğin sizden sayfa indirmek).
nh2

1
@ManishSapkal Muhtemelen bunun için yeni bir soru açmalısınız, yorumlara pek uymuyor.
nh2

15

socket.disconnect() sadece istemci tarafında kullanılabilir, sunucu tarafında kullanılamaz.

Client.emit('disconnect')sunucudaki bağlantı kesilme olayını tetikler, ancak istemcinin bağlantısını etkin bir şekilde kesmez. Müşteri bağlantının koptuğunun farkında değil.

Öyleyse soru kalır: Bir istemciyi sunucu tarafından bağlantısını kesmeye nasıl zorlayabilirim?


1
Client.emit('disconnect')Son soket.io sürümlerinde artık manuel olarak aramak zorunda değilsiniz , artık bir sunucu tarafı var socket.disconnect()( cevabıma bakın).
nh2

5
Son güncellemeler nedeniyle, amswer'ınız artık yanlış, dolayısıyla -1.
corazza

Kabul ediyorum, bu cevap artık geçerli değil, çünkü artık socket.disconnect()sunucu tarafında da kullanılabilir.
Vassilis Barzokas

@VassilisBarzokas Ya bir geri arama istersem ve disconnect()işlev tamamlandıktan sonra geri aramaya bazı parametreler iletirsem ?
newguy

Bir tarafın diğer tarafa bağlantıyı kesmek istediğini bildirdiği, ardından yapmanız gereken şeyi yaptığı ve ardından fiilen bağlantıyı kesen bir dizi mesaj oluşturun .
Mike 'Pomax' Kamermans

8

Sunucunun istemciye bağlantı kesme işlevini çağırmasını sağlayan bir mesaj gönderememenizin herhangi bir nedeni var mı?

İstemcide:

socket.emit('forceDisconnect');

Sunucuda:

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

7
Çünkü istemci tarafı kodunun tam olarak istediğiniz gibi çalışacağına asla güvenilemez. Kullanıcılar kolayca değiştirebilir.
Kaustubh Karkare

4

Soketinizin adlandırılmış soketi olduğunu varsayarak, şunu kullanın:

socket.disconnect()

2
Maalesef bu işe yaramıyor. Sunucu tarafından belirli bir istemciyle olan bağlantıyı kapatmaya çalışıyorum.
Daniel Kenney

4

Bunu google'da bulanlar için - bunun için şu anda bir çözüm var:

Socket.disconnect()istemciyi (sunucu tarafı) başlatır. Müşterinin bağlantıda kalma şansı yok :)


Sunucuda bağlantısı kesilen kullanıcının soketini nasıl bulurum?
Manish Sapkal

Manish: Bağlantısının kesilip disconnectkesilmediğini öğrenmek için soketin olayını dinleyin . closeOlay da olabilir, tam olarak emin değilim. Bununla ilgili daha fazla bilgi için socket.io'nun belgelerine bakın.
Sascha Gehlich


3

Benim durumumda, temeldeki bağlantıyı koparmak istedim, bu durumda socket.disconnect(true), burada kaynaktan gerekli olduğunu görebileceğiniz gibi aramak zorunda kaldım.



1

Socket.io, yapabilmeniz için kalp atışlarını kesmek / bağlamak / kontrol etmek için EventEmitter modelini kullanır. Client.emit('disconnect');


1

Bu benim için işe yaramadı :

`socket.disconnect()` 

Bu çalışma yaptı benim için:

socket.disconnect(true)

Devretmek, trueyalnızca istemcinin Socket IO Documentation'a bağlı olduğu ad alanını değil, istemciye olan temel bağlantıyı kapatır .


Örnek bir kullanım durumu: İstemci, geçersiz erişim belirteciyle web soketi sunucusuna bağlandı (erişim belirteci, bağlantı parametreleriyle web soket sunucusuna aktarıldı). Web soket sunucusu, istemciye geçersiz erişim belirteci nedeniyle bağlantıyı kapatacağını bildirir:

// (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');
// });

0

Bağlantı kesildikten sonra tüm olayları yok saymak için bağlı istemci için client.emit('disconnect')+ kullanıyorumclient.removeAllListeners()


0

Müşteri tarafında kullanıyorum socket.disconnect();

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

0

kullanım:

socket.Disconnect () // tamam

kullanmayın :

socket.disconnect ()


0

Sen yapabilirsin socket = undefinedBağlandıktan soket silme de. Yani ne zaman bağlanmak istediğinizde soket (url)

Yani böyle görünecek

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

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;

-1

Bir diziye yeni soket bağlantıları ekleyin ve ardından hepsini kapatmak istediğinizde - döngü yapın ve bağlantıyı kesin. (sunucu tarafı)

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();                      
    });    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.