buộc ngắt kết nối máy khách khỏi máy chủ với socket.io và nodejs


117

Có cách nào để ngắt kết nối máy khách với SocketIO và đóng kết nối theo đúng nghĩa đen không? Vì vậy, nếu ai đó được kết nối với máy chủ của tôi và tôi muốn đóng kết nối giữa họ và máy chủ của mình, tôi sẽ làm như thế nào?

Câu trả lời:


145

Chỉnh sửa: Điều này hiện có thể

Bây giờ bạn có thể chỉ cần gọi socket.disconnect()ở phía máy chủ .

Câu trả lời ban đầu của tôi:

Điều này là chưa thể được nêu ra.

Nếu bạn cần, hãy bình chọn / bình luận về vấn đề này .


Vì vậy, tôi đang làm điều đó và nó buộc máy khách phải ngắt kết nối, thật không may, có vẻ như máy khách chỉ cần kết nối lại ngay lập tức. Tôi đang hiểu sai chuyện gì đang xảy ra, hay đó là hành vi được mong đợi?
kybernetikos

@kybernetikos Vâng, tôi mong đợi điều này - sau cùng, khách hàng có thể chọn những gì cần làm với của riêng họ. Thông thường, bạn muốn loại bỏ phía bên kia khỏi kết nối hiện tại , chẳng hạn như do hết thời gian chờ xác thực - kết nối lại sau điều này thậm chí có thể là mong muốn.
nh2

Vậy bạn có biết cách nào để nói với khách hàng rằng "hãy biến đi và tôi thực sự có ý đó"? Tôi đang suy nghĩ từ quan điểm xác định rằng một khách hàng đang hoạt động không tốt và không muốn họ sử dụng hết tài nguyên trên máy chủ của tôi.
kybernetikos

@kybernetikos Không, bạn không thể làm điều đó (nói chung). Nếu bạn đang lập trình phía máy khách, tất nhiên bạn có thể thực hiện bất kỳ logic nào bạn muốn, ví dụ như ngăn nó kết nối lại. Nếu không, phải đá liên tục vào người dùng, hoặc nếu thực sự cần thiết, phải dùng đến các kỹ thuật chặn tiêu chuẩn; cấp độ thấp hơn được thực hiện (ví dụ iptables), bạn sẽ tiết kiệm được nhiều tài nguyên hơn. Trong hầu hết các trường hợp, chỉ cần khởi động máy khách là đủ, vì socketio không kết nối nhanh như vậy và nếu ai đó thực sự muốn DoS bạn, họ vẫn có những cách khác (ví dụ: tải các trang từ bạn).
nh2 17/04/13

1
@ManishSapkal Bạn có thể nên mở một câu hỏi mới cho câu hỏi đó, nó không phù hợp với nhận xét.
nh2

15

socket.disconnect() chỉ có thể được sử dụng ở phía máy khách, không được sử dụng ở phía máy chủ.

Client.emit('disconnect')kích hoạt sự kiện ngắt kết nối trên máy chủ, nhưng không ngắt kết nối máy khách một cách hiệu quả. Khách hàng không biết về việc ngắt kết nối.

Vì vậy, câu hỏi vẫn còn: làm thế nào để buộc một máy khách ngắt kết nối với phía máy chủ?


1
Bạn không phải gọi Client.emit('disconnect')theo cách thủ công nữa với các phiên bản socket.io gần đây, hiện đã có phía máy chủ socket.disconnect()(xem câu trả lời của tôi).
nh2

5
Do các bản cập nhật gần đây, amswer của bạn hiện không chính xác, do đó là -1.
corazza

Tôi đồng ý, câu trả lời này không còn hợp lệ, bởi vì bây giờ nó socket.disconnect()có thể được sử dụng ở phía máy chủ.
Vassilis Barzokas

@VassilisBarzokas Điều gì sẽ xảy ra nếu tôi muốn một lệnh gọi lại và chuyển một số tham số cho lệnh gọi lại sau khi disconnect()hàm kết thúc?
newguy

tạo một tập hợp tin nhắn đã thỏa thuận trong đó một bên thông báo cho bên kia rằng họ muốn ngắt kết nối, sau đó thực hiện những gì bạn cần làm và sau đó thực sự ngắt kết nối.
Mike 'Pomax' Kamermans

8

Bất kỳ lý do nào tại sao bạn không thể yêu cầu máy chủ phát ra một thông báo cho máy khách khiến nó gọi hàm ngắt kết nối?

Trên khách hàng:

socket.emit('forceDisconnect');

Trên máy chủ:

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

7
Bởi vì mã phía máy khách không bao giờ có thể được dựa vào để hoạt động chính xác như bạn muốn. Người dùng có thể dễ dàng sửa đổi nó.
Kaustubh Karkare

4

Giả sử ổ cắm có tên của ổ cắm của bạn, hãy sử dụng:

socket.disconnect()

2
Thật không may, điều này không hoạt động. Tôi đang cố gắng đóng kết nối với một máy khách cụ thể từ phía máy chủ.
Daniel Kenney

4

Đối với những người tìm thấy điều này trên google - có một giải pháp cho điều này ngay bây giờ:

Socket.disconnect()khởi động máy khách (phía máy chủ). Không có cơ hội để khách hàng duy trì kết nối :)


Làm cách nào để tìm ổ cắm của người dùng bị ngắt kết nối trên máy chủ?
Manish Sapkal

Manish: Lắng nghe disconnectsự kiện của ổ cắm để tìm xem nó đã ngắt kết nối hay chưa. Cũng có thể là closesự kiện, tôi không chắc lắm. Xem tài liệu của socket.io để biết thêm thông tin về điều này.
Sascha Gehlich


3

Trong trường hợp của tôi, tôi muốn loại bỏ kết nối cơ bản trong trường hợp đó tôi phải gọi socket.disconnect(true)như bạn có thể thấy là cần thiết từ nguồn ở đây


2

client._onDisconnect() nên làm việc


1
Đây hoạt động hoàn hảo .. Im duy trì lập bản đồ của riêng tôi đối với khách hàng .. sử dụng bản đồ đó ... một cách dễ dàng ngắt kết nối khách hàng .. cổ vũ
Arenstar

1

Socket.io sử dụng mẫu EventEmitter để ngắt kết nối / kết nối / kiểm tra nhịp tim để bạn có thể thực hiện. Client.emit('disconnect');


1

Điều này không hiệu quả với tôi:

`socket.disconnect()` 

Điều này đã làm việc cho tôi:

socket.disconnect(true)

Việc bàn giao truesẽ đóng kết nối lớp dưới với máy khách và không chỉ vùng tên mà máy khách được kết nối với Tài liệu IO Socket .


Một trường hợp sử dụng ví dụ: Máy khách đã kết nối với máy chủ ổ cắm web bằng mã thông báo truy cập không hợp lệ (mã thông báo truy cập được bàn giao cho máy chủ ổ cắm web có thông số kết nối). Máy chủ ổ cắm web thông báo cho khách hàng rằng nó sẽ đóng kết nối do mã thông báo truy cập không hợp lệ:

// (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

Tôi đang sử dụng client.emit('disconnect')+ client.removeAllListeners()cho ứng dụng được kết nối để bỏ qua tất cả các sự kiện sau khi ngắt kết nối


0

Tôi đang sử dụng ở phía khách hàng socket.disconnect();

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

0

sử dụng :

socket.Disconnect () // ok

không được dùng :

socket.disconnect ()


0

Bạn có thể socket = undefinedxóa ổ cắm mà bạn đã kết nối. Vì vậy, khi muốn kết nối hãy làm socket (url)

Vì vậy, nó sẽ giống như thế này

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

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;

-1

Thêm các kết nối socket mới vào một mảng và sau đó khi bạn muốn đóng tất cả - hãy lặp lại chúng và ngắt kết nối. (phía máy chủ)

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();                      
    });    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.