2011-10-07 27 views
16

Tôi muốn kiểm tra xem liệu một hệ thống từ xa có thể truy cập được bằng cách sử dụng Java hay nói cách khác là "gửi một ping" bằng cách sử dụng Java. Chức năng này nên được đóng gói trong một phương thức có giá trị boolean, ví dụ:Làm thế nào để kiểm tra xem một hệ thống từ xa có thể truy cập được không

public boolean isReachable(String ip) { 
    // what to do :-) 
} 

Tôi đã thử nghiệm lớp Java Process, nhưng tôi không nghĩ rằng đó là cách tốt nhất để làm điều này, vì phức tạp xử lý đầu ra với OutputBuffers.

Process proc = Runtime.getRuntime().exec("ping " + ip); 

Một khả năng khác sẽ được tạo ra một kết nối Socket và xử lý ngoại lệ ném, nhưng nếu hệ thống từ xa là một "trần truồng" unix hệ thống, có thể có không có ổ cắm ở phía bên kia :-) Ngoài ra, tôi muốn muốn có thể đặt thời gian chờ, khi không thể truy cập được hệ thống từ xa.

Vậy làm cách nào tôi có thể thực hiện việc này? Cảm ơn bạn!

+0

Vì mục đích gì? Nếu có một máy chủ ở đó bạn muốn kết nối, chỉ cần cố gắng kết nối. – EJP

Trả lời

34
InetAddress.getByName(ip).isReachable(timeout); 
+1

OMG! Cảm ơn bạn rất nhiều :-) Chính xác những gì tôi đang tìm kiếm! – strauberry

+5

chúng ta có thể kiểm tra xem một cổng cụ thể có thể truy cập được không? – tasomaniac

+0

@tasomaniac thử một cái gì đó như thế này: http://pastebin.com/DuwZ6s5E (chưa được kiểm tra) – scotty86

9

InetAddress.getByName(host).isReachable(timeOut) (thấy here)

+6

isReachable() không thể tin cậy để ping đáng tin cậy các máy chủ bên ngoài mạng con cục bộ. Lý do có khả năng nhất là các cửa sổ đang sử dụng ping ICMP trong khi isReachable() không sử dụng được. Đây là trường hợp ít nhất là Java 6. – flash

+5

Có một chú thích trong phương thức 'isReachable0' có nguồn gốc (trong' Inet4AddressImpl.c), có nghĩa là "Windows hiện tại của các cổng ICMP & RAW quá không đáng tin cậy bây giờ. để thử nó và chỉ dựa vào TCP. Chúng tôi có thể truy cập lại và kích hoạt mã này trong tương lai. " ' –

+0

Đã xác nhận, trong máy kiểm tra WXP của tôi, lệnh này mặc định là kết nối TCP trên cổng 7 (echo). Nó trả về có thể truy cập ngay cả đối với IP không tồn tại hoặc với tường lửa bị chặn. –

4

Dường như bạn đang sử dụng Linux, do đó bạn có thể sẽ thấy rằng isReachable() là không đáng tin cậy (bởi vì bạn sẽ không có quyền gửi các gói tin ICMP, và rất vài máy chủ có dịch vụ Echo đang chạy).

Nếu đúng như vậy thì tôi nghĩ bạn sẽ cần phải sử dụng đẻ trứng một quá trình theo cách bạn đề nghị, nhưng tôi khuyên bạn nên sử dụng một lệnh như:

ping -c 1 hostname 

này sẽ chấm dứt sau một nỗ lực và sau đó bạn có thể kiểm tra trạng thái thoát của quy trình - đáng tin cậy hơn nhiều so với phân tích đầu ra tiêu chuẩn.

Trả về Ping 0 để thành công khác không thành công do lỗi.

+0

Cảm ơn bạn rất nhiều vì lời khuyên này! Tôi sẽ tạo một mục trong trình gỡ lỗi là "cải tiến" :-) – strauberry

0

Tôi biết câu hỏi này đã tìm thấy câu trả lời nhưng tôi muốn thêm mã của tôi chỉ để "sao chép-dán".

public boolean isIpReachable(String ip, int timeout){ 
    boolean state = false; 

    try { 
     state = InetAddress.getByName(ip).isReachable(timeout); 
    } catch (IOException e) { 
     //Parse error here 
    } 

    return state; 
} 
Các vấn đề liên quan