2013-06-09 41 views
6

Tôi đang làm việc trên một dự án Java cần phải có kết nối internet mọi lúc.Cách kiểm tra kết nối internet trong Java

Tôi muốn chương trình của mình tiếp tục kiểm tra kết nối internet tại một khoảng thời gian nào đó (nói 5 hoặc 10 giây) và hiển thị thông báo ngay khi không có kết nối internet nào được phát hiện.

Tôi đã cố gắng sử dụng các phương pháp isReachable để đạt được chức năng này, dưới đây là mã -

try 
{ 
    InetAddress add = InetAddress.getByName("www.google.com"); 
    if(add.isReachable(3000)) System.out.println("Yes"); 
    else System.out.println("No"); 
} 
catch (UnknownHostException e) 
{ 
    System.out.println("unkownhostexception"); 
} 
catch (IOException e) 
{ 
    System.out.println("IoException"); 
} 

Nhưng mã này luôn trả về "Không". Vấn đề với mã này là gì?

Cảm ơn

+1

http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping -the-ip-address – uselpa

+0

Cảm ơn nhưng giải pháp được cung cấp ở đó, không hoạt động trong trường hợp của tôi. tác giả cũng cho biết chỉ một hack của nó có thể không hoạt động trong một số trường hợp. –

Trả lời

9

Cách duy nhất tôi biết là gửi một gói tin đến một số máy chủ được biết đến, được gọi theo nghĩa là bạn biết nó sẽ luôn luôn và chạy và truy cập từ các trang web gọi.

Tuy nhiên, ví dụ: nếu bạn chọn máy chủ lưu trữ có tên, ping có thể không thành công do lỗi tra cứu DNS.

Tôi nghĩ bạn không nên lo lắng về vấn đề này: nếu chương trình của bạn cần kết nối Internet, đó là vì nó gửi hoặc nhận dữ liệu. Kết nối không phải là một khái niệm liên tục như một con sông, nhưng giống như một con đường. Vì vậy, chỉ cần sử dụng tiêu chuẩn Java để xử lý các lỗi kết nối: IOExceptiions. Khi chương trình của bạn phải gửi dữ liệu, API cơ bản sẽ dứt khoát ném một IOE trong trường hợp mạng bị hỏng. Nếu chương trình của bạn hy vọng dữ liệu, thay vào đó, hãy sử dụng thời gian chờ hoặc điều gì đó tương tự để phát hiện các lỗi có thể có trong ngăn xếp mạng và báo cáo nó cho người dùng.

15

Tôi đồng ý với đề xuất của Raffaele nếu bạn chỉ cần sử dụng internet thường xuyên. Chỉ cần cố gắng để làm điều đó, và được chuẩn bị để xử lý các trường hợp ngoại lệ khi nó không thành công.

Nếu bạn cần theo dõi tính khả dụng của Internet vì một số lý do, ngay cả khi bạn không định sử dụng nó và không biết bạn sẽ kết nối với ai, chỉ cần thử kết nối với một thiết bị đã biết trang web (google.com, amazon.com, baidu.com ...).

này sẽ làm việc để thử nghiệm một vài trang web:

public static void main(String[] args) { 
    System.out.println(
     "Online: " + 
     (testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com")) 
    ); 
} 


public static boolean testInet(String site) { 
    Socket sock = new Socket(); 
    InetSocketAddress addr = new InetSocketAddress(site,80); 
    try { 
     sock.connect(addr,3000); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } finally { 
     try {sock.close();} 
     catch (IOException e) {} 
    } 
} 
+1

có, tôi đang làm một cái gì đó tương tự. Cảm ơn rất nhiều ! –

+0

Đó là hoạt động, cảm ơn rất nhiều. Phương thức testInet() là thủ thuật. – russellhoff

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