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ó 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:
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 .
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).
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ủ?
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).
socket.disconnect()
có thể được sử dụng ở phía máy chủ.
disconnect()
hàm kết thúc?
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();
});
Giả sử ổ cắm có tên của ổ cắm của bạn, hãy sử dụng:
socket.disconnect()
Đố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 :)
disconnect
sự kiện của ổ cắm để tìm xem nó đã ngắt kết nối hay chưa. Cũng có thể là close
sự 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.
Kiểm tra sáng nay, nó xuất hiện bây giờ là:
socket.close()
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
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');
Đ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 true
sẽ đó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');
// });
Bạn có thể socket = undefined
xó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;
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();
});