2014-07-07 32 views
6

Tôi đã xem xét để triển khai cơ chế khôi phục kết nối WebSocket đáng tin cậy.Phát hiện trạng thái kết nối WebSocket đáng tin cậy

Sau một số điều tra, tôi đã tìm thấy một cách gửi tin nhắn đến máy chủ (ping/pong) và kiểm tra xem tôi có nhận được toàn bộ số pong trong một khoảng thời gian giới hạn hay không.

Như vậy, hoặc là nếu kết nối thực sự là xuống hoặc nó rất chậm nó sẽ được coi là bị ngắt kết nối nếu một pong timeout chờ đợi, và mã nên gọi WebSocket.close().

Vào cuối ngày, tôi hỏi câu hỏi này để xác thực luồng công việc kết nối lại kết nối bằng WebSockets và kiểm tra xem tôi có thiếu gì đó không.

Tức là, câu hỏi của tôi là, đây có phải là luồng công việc phù hợp và đáng tin cậy để triển khai cơ chế kết nối lại WebSockets không?

Trả lời

3

Giao thức websocket xác định các khung điều khiển đặc biệt cho ping và pong, nhưng chúng không thể truy cập được thông qua API JavaScript. Nhưng nếu máy chủ gửi các khung đó, trình duyệt sẽ trả lời.

Tuy nhiên, nếu kết nối bị ngắt đột ngột và trở thành half-open connection, mặc dù máy chủ sẽ phát hiện ra, trình duyệt sẽ không. Vì vậy, tôi đoán rằng gửi ping của riêng bạn ở cấp độ ứng dụng không phải là một ý tưởng tồi.

Trả lời câu hỏi của bạn có, đó là ý tưởng tốt bởi vì nếu kết nối được mở một nửa, khách hàng của bạn không nhận được bản cập nhật vì anh ấy nghĩ rằng nó được kết nối. Trong websocket, máy khách phải khởi tạo kết nối, vì vậy ngay cả khi trình duyệt nhận ra sự ngắt kết nối, không có gì nó có thể làm để kết nối lại.

+0

Có, bạn nói đúng (và cảm ơn "xác nhận" của bạn). BTW, có trường hợp sử dụng điện thoại di động, nơi gửi ping cứ 20 giây một lần (ví dụ) có tác động đến pin. Trong trường hợp của tôi, vì tôi không sử dụng WebSockets cho đầu vào của người dùng, nhưng để đẩy máy chủ, tôi muốn thông báo cho người dùng rằng kết nối có vấn đề càng sớm càng tốt. –

+1

Bạn có thể phát hiện độ trễ của mạng bằng cách gửi một ping với dấu thời gian và làm cho máy chủ lặp lại nó trong bàn phím. Nhưng nếu giao tiếp bị cắt (nghĩa là: nếu không có kết thúc TCP đúng) thì thật khó để nói rằng nó bị cắt cho đến khi bạn cố gửi một cái gì đó: http://blog.stephencleary.com/2009/05/detection-of-half-open -dropped.html – vtortola

+0

@vtrola Đây là một bài viết rất thú vị (tại sao bạn không thêm nó vào câu trả lời của bạn làm tài liệu tham khảo?). BTW, tôi không chắc chắn nếu tôi hiểu được giải pháp đầu tiên của * Phương pháp đúng để phát hiện các kết nối bị mất *. Tôi hiểu rằng đó là về việc gửi một tin nhắn trống (một thông điệp giữ kín), và chờ đợi một thời gian giới hạn, và nếu không có phản ứng nhận được trong một thời gian, kết nối được coi là bị mất. –

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