Có cách nào để phát hiện khi khách hàng ngắt kết nối khỏi máy chủ sao băng, bằng cách làm mới hoặc điều hướng khỏi trang, để máy chủ có thể thử dọn dẹp không?Làm sạch máy chủ sau khi máy khách ngắt kết nối
Trả lời
Một kỹ thuật là triển khai phương pháp "keepalive" mà mỗi khách hàng thường xuyên gọi. Điều này giả định bạn đã có một số user_id
được giữ trong số Session
của từng khách hàng.
// server code: heartbeat method
Meteor.methods({
keepalive: function (user_id) {
if (!Connections.findOne(user_id))
Connections.insert({user_id: user_id});
Connections.update(user_id, {$set: {last_seen: (new Date()).getTime()}});
}
});
// server code: clean up dead clients after 60 seconds
Meteor.setInterval(function() {
var now = (new Date()).getTime();
Connections.find({last_seen: {$lt: (now - 60 * 1000)}}).forEach(function (user) {
// do something here for each idle user
});
});
// client code: ping heartbeat every 5 seconds
Meteor.setInterval(function() {
Meteor.call('keepalive', Session.get('user_id'));
}, 5000);
nếu bạn đang sử dụng Auth bạn có quyền truy cập vào ID của người dùng trong phương pháp và Xuất bản chức năng, bạn có thể thực hiện theo dõi của bạn có .. ví dụ bạn có thể đặt "lần xem cuối cùng" khi người dùng chuyển đổi phòng:
Meteor.publish("messages", function(roomId) {
// assuming ActiveConnections is where you're tracking user connection activity
ActiveConnections.update({ userId: this.userId() }, {
$set:{ lastSeen: new Date().getTime() }
});
return Messages.find({ roomId: roomId});
});
Tôi nghĩ cách tốt hơn là bắt sự kiện đóng socket trong chức năng xuất bản.
Meteor.publish("your_collection", function() {
this.session.socket.on("close", function() { /*do your thing*/});
}
UPDATE:
Mới hơn phiên bản của thiên thạch sử dụng _SESSION như thế này:
this._session.socket.on("close", function() { /*do your thing*/});
Điều đó thật tuyệt. Nhưng sau đó tôi dường như chạy vào vấn đề này: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz
Cảm ơn . Đây là câu trả lời cho câu hỏi của tôi: [Meteor quan sát chạy mãi mãi] (http://stackoverflow.com/q/12902392/599991) – zVictor
Tôi sử dụng meteor 0.6.1 và cho dòng này 'this.session.socket.on (" đóng ", function() {/ * làm điều của bạn * /});' my server trả về _TypeError: Không thể đọc thuộc tính 'socket' của undefined_ Nhưng khi tôi sửa nó thành 'this._session.socket.on (" close ", function() {/ * làm việc của bạn * /}); 'nó hoạt động tốt, nhờ – fantom
Tôi đã thực hiện một gói thông minh Meteor theo dõi tất cả các phiên kết nối từ phiên khác nhau và phát hiện cả hai phiên logout và ngắt kết nối các sự kiện, mà không phải tốn kém.
Để phát hiện các sự kiện ngắt kết nối/logout, bạn chỉ có thể làm như sau:
UserStatus.on "connectionLogout", (info) ->
console.log(info.userId + " with session " + info.connectionId + " logged out")
Bạn cũng có thể sử dụng nó chủ động. Kiểm tra nó ra!
CHỈNH SỬA:v0.3.0
trạng thái người dùng giờ đây cũng theo dõi người dùng không sử dụng!
Điều này có thể được thực hiện trên cơ sở mỗi trang và không thông qua toàn bộ ứng dụng không? – Scalahansolo
Có, mặc dù chưa được triển khai. Mở yêu cầu tính năng! –
Tôi đang sử dụng Iron Router và gọi mã dọn dẹp của tôi trên sự kiện unload
của bộ điều khiển chính của tôi. Chắc chắn điều này sẽ không bắt sự kiện đóng tab, nhưng vẫn cảm thấy đủ tốt cho nhiều trường hợp sử dụng
ApplicationController = RouteController.extend({
layoutTemplate: 'root',
data: {},
fastRender: true,
onBeforeAction: function() {
this.next();
},
unload: function() {
if(Meteor.userId())
Meteor.call('CleanUpTheUsersTrash');
},
action: function() {
console.log('this should be overridden by our actual controllers!');
}
});
- 1. SignalR: ngắt kết nối máy khách
- 2. Socket.io - Hướng dẫn kết nối lại sau khi ngắt kết nối phía máy khách
- 3. Làm thế nào để xác định ngắt kết nối máy chủ từ máy khách SignalR?
- 4. Clojure (aleph) phát hiện khi máy chủ ngắt kết nối
- 5. psycopg2 ngắt kết nối khỏi máy chủ
- 6. Kết nối lại máy khách RMI sau khi máy chủ khởi động lại
- 7. Cách xử lý ngắt kết nối máy khách WCF
- 8. máy chủ http node.js http, phát hiện khi khách hàng ngắt kết nối
- 9. Kết nối máy khách-máy chủ FIFO thích hợp
- 10. Kết nối máy khách Ethernet (Uno) không thành công sau khi nhiều máy khách in
- 11. Kết nối máy khách IPv4 với máy chủ IPv6: kết nối bị từ chối
- 12. ngắt kết nối ứng dụng khách khỏi tín hiệu phía máy chủ
- 13. Node.js: socket.io đóng kết nối máy khách
- 14. PHP - Phát hiện ngắt kết nối máy chủ từ xa
- 15. Máy chủ Webs Alchemy - Làm thế nào để tôi buộc phải ngắt kết nối một máy khách?
- 16. Lỗi khi thực hiện kết nối SSL từ máy khách Java đến máy chủ .NET
- 17. Làm thế nào để kết nối lại máy khách socket.io hoạt động sau khi tự động kết nối lại lần?
- 18. Làm cách nào để ngắt kết nối máy khách một cách mạnh mẽ trong SignalR
- 19. Làm thế nào để phát hiện một khách hàng ngắt kết nối bằng cách sử dụng một máy khách ống/máy chủ được đặt tên?
- 20. Từ chối kết nối từ máy chủ
- 21. Khách hàng bị ngắt kết nối
- 22. Máy chủ không được phép kết nối với máy chủ mysql này khi tạo kết nối cục bộ
- 23. Cách kết nối từ máy khách VMware với máy chủ được cài đặt trên máy chủ Windows 7?
- 24. Thuật ngữ Máy khách và Máy chủ
- 25. Làm mới iAd sau khi ngắt kết nối mạng
- 26. kết nối máy khách telnet dừng nhận dữ liệu, máy chủ vẫn đang gửi
- 27. Xử lý ngắt kết nối máy khách trong dịch vụ WCF hai chiều
- 28. Thực tiễn tốt nhất để phát hiện ngắt kết nối máy khách trong .NET?
- 29. C, lập trình socket: Kết nối nhiều máy khách với máy chủ bằng cách chọn()
- 30. Phát hiện ngắt kết nối của máy khách trong SQL Server
Sau nhiều tìm kiếm tôi nghĩ đây là giải pháp tốt nhất hiện nay. Cảm ơn!! – greggreg
Đây gần như mã giả, vì nó không hoạt động như: setInterval đầu tiên không có khoảng thời gian nào được chỉ định. Ngoài ra lệnh Connections.update không chỉ định để cập nhật {'user_id': user_id}. Có thể có các lỗi khác. Đó là một khởi đầu tốt đẹp mặc dù. –
@debergalis Đây có phải là cách được khuyến nghị để xem khách hàng có bị chết không? – user2602152