Tìm kiếm trang web

javascript - websocket onclose không được kích hoạt trên chrome - linux khi client bị ngắt kết nối mạng


Tôi đã triển khai websocket bằng cách sử dụng Java ở phía server. Ở phía client, tôi tạo đối tượng websocket, và tôi có hàm riêng của mình cho tất cả các sự kiện bao gồm onClose. Tôi đã thử nghiệm kết nối lại... websocket trên Chrome 26, Mozilla cả trên Windows và Chrome.

Chrome trên Windows kích hoạt sự kiện onclose khi tôi rút dây mạng (tức là onclose kích hoạt với closecode 1006 [đóng bất thường] như đã đề cập trong https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent) nhưng Chrome trên Linux không kích hoạt sự kiện nào.

Vui lòng gợi ý tôi đã phạm lỗi gì.

Câu hỏi chính xác của tôi là tại sao chrome trên Windows lại kích hoạt onclose khi mạng bị ngắt, nhưng trong trường hợp của Linux, nó lại không được kích hoạt.

Câu trả lời #1

Có khả năng những ứng dụng này không nhận thấy kết nối TCP bị gián đoạn. Một thời gian chờ được sử dụng để phát hiện một kết nối TCP thất bại, và tôi tin rằng thời gian chờ mặc định khá dài.

Trình duyệt/hệ điều hành nên nhận thấy kết nối đã mất ngay khi bạn cố gắng gửi dữ liệu. Hãy thử gửi một số dữ liệu sau khi rút cáp mạng, xem liệu điều đó có kích hoạt sự kiện không.

Ngoài ra, bạn đã chờ tín hiệu bao lâu rồi? Có thể kết nối chỉ đơn giản là có thời gian chờ TCP dài.

Nếu bạn vẫn không nhận được sự kiện đóng, có thể là do lỗi trong việc triển khai. Nếu bạn thực sự cần biết khi nào kết nối bị gián đoạn, hãy triển khai một cơ chế ping với thời gian chờ của riêng bạn. Tôi tin rằng giao thức websocket định nghĩa cơ chế ping riêng của nó, có thể bạn nên xem xét điều đó.

Ngoài ra, dường như đã có một vấn đề được đăng cho Chrome về việc này. Có lẽ nó sẽ giúp ích cho bạn.