2009-09-30 47 views
7

Tôi đã viết một máy chủ thực hiện IO không chặn bằng cách sử dụng API Java NIO. Tôi thấy một tình huống mà thỉnh thoảng một ứng dụng khách tắt đột ngột (ví dụ: do mất điện) và kết nối được mở ở phía máy chủ.NIO - Phát hiện kết nối đã đóng

Một đồng nghiệp đã gặp phải vấn đề tương tự và nói rằng anh ấy sử dụng nhịp đập trái tim trên đường dây để phát hiện loại điều này, nhưng tôi hy vọng có một cách dễ dàng hơn. Đã có người khác gặp phải vấn đề này?

Một số thông tin bổ sung: Thiết kế máy chủ hiện tại của tôi sẽ hủy khóa và đóng kênh tương ứng nếu kênh đó bắt được IOException khi thử thao tác đọc/ghi. Cách tiếp cận này dường như hoạt động 99% thời gian; Tôi đã chỉ nhìn thấy một số ít các tình huống mà kết nối dường như được mở ra.

Trả lời

6

Không có nhịp tim cấp ứng dụng, tùy chọn duy nhất của bạn là dựa vào TCP keepalive. Nhưng khoảng thời gian mặc định là rất dài (như 2 giờ). RFC không đề xuất khoảng thời gian ngắn hơn 2 giờ.

Bạn có thể làm cho ngắn hơn nhưng đây là thông số toàn hệ thống. Trên một số hệ điều hành, nó thậm chí yêu cầu xây dựng lại hạt nhân để thay đổi điều này.

Do đó, nhịp tim được khuyến nghị cao cho bất kỳ giao thức dựa trên TCP nào.

+0

Cảm ơn ZZ Coder - Đó là những gì tôi nghĩ (đáng sợ). Tôi khá ngạc nhiên rằng đây không phải là một tính năng của TCP. – Adamski

+0

Một "ping" thay vào đó, các ứng dụng này không phải là con người - bạn biết đấy. –

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