2012-10-10 43 views
14

Tôi có các máy khách di động được kết nối với máy chủ node.js, chạy socket.io qua xhr-polling. Tôi có hai loại khách hàng:Kiểm soát thời gian chờ nhịp tim từ máy khách trong socket.io

  • Loại A

    Khi kết nối chia tay do vấn đề mạng (hoặc rằng treo client) thời gian chờ nhịp tim mặc định quá dài

  • Loại B

    Khi kết nối ngắt cho khách hàng này, tôi cần phải cung cấp thêm thời gian để khôi phục - điều quan trọng hơn là khách hàng khôi phục hơn máy chủ ngắt kết nối/phiên

Vì vậy, câu hỏi của tôi là làm thế nào để tôi định cấu hình (nếu có thể) nhịp tim hết thời gian chờ từ ứng dụng thực tế?

+1

Không chắc về thời gian chờ của nhịp tim, nhưng nếu bạn đang sử dụng socket.io-client, có một số tùy chọn hữu ích có thể giúp bạn, như 'kết nối timeout'' kết nối lại '' reconnection tries' – vinayr

Trả lời

42

Theo như tôi có thể biết, có 2 giá trị quan trọng ở đây: máy chủ gửi nhịp tim đến máy khách sau mỗi heartbeat interval giây; máy khách trả lời trực tiếp, nếu không có phản hồi, máy chủ quyết định máy khách đã chết. Khách hàng đợi nhịp tim từ máy chủ trong heartbeat timeout giây kể từ nhịp tim cuối cùng (rõ ràng là cao hơn heartbeat interval). Nếu nó đã không nhận được tin từ các máy chủ trong heartbeat timeout giây, nó giả định máy chủ đã chết (và sẽ bắt đầu ngắt kết nối/kết nối lại dựa trên các tùy chọn khác mà bạn đã thiết lập.

Mặc định giá trị là heartbeat interval = 25sheartbeat timeout = 60s. Cả hai mặt hàng là . bộ trên máy chủ, các heartbeat timeout được gửi cho khách hàng khi kết nối

Thay đổi heartbeat timeout cho một khách hàng duy nhất là dễ dàng:

var socket = io.connect(url); 
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds 

Tuy nhiên trên máy chủ, giá trị heartbeat interval dường như là một phần của một đối tượng được chia sẻ (Manager, đó là những gì bạn nhận được từ cuộc gọi var io = require("socket.io").listen(server)), có nghĩa là nó không thể dễ dàng được thay đổi cho các ổ cắm riêng lẻ.

Tôi chắc chắn rằng với một số socket.io hack bạn sẽ có thể để làm cho nó xảy ra, nhưng bạn có thể phá vỡ những thứ khác trong quá trình này ...

+0

cảm ơn .. rất hữu ích trả lời thực sự – Charmie

+1

câu trả lời tuyệt vời ..... tôi muốn cung cấp cho 100 phiếu bầu..thanks .... rất nhiều .. –

+2

thay vì xem câu trả lời của http://stackoverflow.com/a/31146441/671457 @ Joseph238 nếu bạn ' từ tương lai như tôi. – Capaj

11

Để hoàn thành câu trả lời Claude, bạn có thể thiết lập các giá trị tại các đòn bẩy máy chủ, với đoạn mã sau

io.set('heartbeat interval', 5); 
io.set('heartbeat timeout', 11); 

và sau đó bạn có thể tạo ra 2 Node.js máy chủ, một cho từng loại khách hàng (A và B), có 2 bộ mong muốn lựa chọn (timeout nhịp tim và khoảng).

+0

nó có thể được tìm thấy trong bất kỳ tài liệu nào đó ở đâu đó không? – youbetternot

+1

Thật không may, tôi đã không tìm thấy điều này trong bất kỳ tài liệu nào, mà là khá ngắn anyway. Nhưng trong thực tế tôi đã nhận thấy bằng cách sử dụng mã trên, các giá trị thực sự được thay đổi. – radu122

+1

Câu trả lời này hợp lệ đối với socket.io 0.9. *. Tài liệu trong socket.io/lib/master.js. –

Các vấn đề liên quan