2009-09-07 36 views
23

Tôi đang cố gắng tìm hiểu xem một Ổ cắm Java TCP có đang được kết nối vào một thời điểm nào đó hay không - không phải là liệu nó có được kết nối hay không.Làm cách nào để kiểm tra xem một Ổ cắm hiện có được kết nối trong Java không?

socket.isConnected(); 

Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn.

+3

http://stackoverflow.com/questions/969866/java-detect-lost-connection – Aziz

+1

Và một http://stackoverflow.com/questions/485855/how-do-you-handle- socket-disconnecting-in-java –

+0

Đã trả lời [ở đây] (http://stackoverflow.com/a/17889321/207421). – EJP

Trả lời

14

Giả sử bạn có một số mức kiểm soát đối với giao thức, tôi là một fan hâm mộ lớn của việc gửi nhịp tim để xác minh rằng kết nối đang hoạt động. Nó được chứng minh là phương pháp chứng minh thất bại nhất và thường sẽ cung cấp cho bạn thông báo nhanh nhất khi kết nối bị hỏng.

TCP keepalives sẽ hoạt động, nhưng nếu máy chủ từ xa đột nhiên tắt nguồn thì sao? TCP có thể mất nhiều thời gian để hết thời gian chờ. Mặt khác, nếu bạn có logic trong ứng dụng của bạn mà mong đợi một nhịp tim trả lời mỗi x giây, lần đầu tiên bạn không nhận được chúng, bạn biết kết nối không còn hoạt động, hoặc bởi một mạng hoặc một vấn đề máy chủ ở phía xa .

Xem Do I need to heartbeat to keep a TCP connection open? để thảo luận thêm.

16
  • socket.isConnected() trả về luôn đúng khi khách hàng kết nối (và thậm chí sau khi ngắt kết nối) lạ !!
  • socket.getInputStream().read()
    • làm cho sự chờ đợi chủ đề cho đầu vào miễn là khách hàng được kết nối và do đó làm cho chương trình của bạn không làm bất cứ điều gì - trừ khi bạn nhận được một số đầu vào
    • returns -1 nếu khách hàng bị ngắt kết nối
  • socket.getInetAddress().isReachable(int timeout): Từ isReachable(int timeout)

    Kiểm tra xem địa chỉ đó có thể truy cập được không. Nỗ lực tốt nhất được thực hiện bởi việc thực hiện để cố gắng tiếp cận máy chủ, nhưng tường lửa và cấu hình máy chủ có thể chặn các yêu cầu dẫn đến trạng thái không thể truy cập trong khi một số cổng cụ thể có thể truy cập được. Một triển khai điển hình sẽ sử dụng ICMP ECHO YÊU CẦU nếu có thể có được đặc quyền, nếu không nó sẽ cố gắng thiết lập kết nối TCP trên cổng 7 (Echo) của máy chủ đích.

+1

Có gì trong "out.checkError()"? Bạn có nghĩa là System.out? Tôi không nghĩ rằng sẽ làm việc. – RoboAlex

+7

Không đúng. 'checkError() cho bạn biết liệu đã có một * trước * IOException khi sử dụng socket. Nó không * trở thành true 'ngay sau khi máy khách bị ngắt kết nối'. -1 – EJP

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