문제

Java를 통해 인터넷에 연결할 수 있는지 어떻게 확인합니까? 한 가지 방법은 다음과 같습니다.

final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...

그러나 그 작업을 수행하는 데 더 적합한 것이 있습니까? 특히 필요한 경우 연속 수표 매우 자주 인터넷 연결 상실이 가능합니까?

도움이 되었습니까?

해결책

실제 응용 프로그램에 필요한 장소에 연결해야합니다. 그렇지 않으면 어딘가에 관련이 있는지 여부를 테스트하고 있습니다 (이 경우 Google).

특히 웹 서비스와 대화하려고하는 경우 웹 서비스를 제어하고 있다면 저렴한 "상태 얻기"웹 메소드를 갖는 것이 좋습니다. 그렇게하면 "실제"호출이 작동하는지 여부에 대한 더 나은 아이디어가 있습니다.

다른 경우에는 열려야하는 포트에 연결을 열거나 핑을 보내는 것이 충분할 수 있습니다. InetAddress.isReachable 여기에서 귀하의 요구에 적합한 API가 될 수 있습니다.

다른 팁

기본적으로 제공 한 코드와 connect 충분해야합니다. 그렇습니다. Google은 사용할 수 없지만 다른 사이트에 연락해야 할 다른 사이트는 있지만 얼마나 가능성이 있습니까? 또한이 코드는 실제로 외부 리소스에 액세스하지 못할 때만 실행해야합니다 ( catch 실패의 원인이 무엇인지 알아 내기 위해 차단). 그래서 외부의 관심 자원이 두 사람이라면 그리고 Google은 사용할 수 없습니다. 순 연결 문제가 발생할 가능성이 있습니다.

private static boolean netIsAvailable() {
    try {
        final URL url = new URL("http://www.google.com");
        final URLConnection conn = url.openConnection();
        conn.connect();
        conn.getInputStream().close();
        return true;
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        return false;
    }
}

사람들은 inetaddress.isreachable을 사용하도록 제안했습니다. 문제는 일부 사이트에서 방화벽이 ICMP 핑 메시지를 차단하도록 구성한다는 것입니다. 따라서 웹 서비스에 액세스 할 수 있더라도 "핑"은 실패 할 수 있습니다.

물론, 그 반대도 마찬가지입니다. 웹 서버가 다운 되어도 호스트가 핑에 응답 할 수 있습니다.

물론 로컬 방화벽 제한으로 인해 기계가 특정 (또는 모든) 웹 서버에 직접 연결할 수 없을 수 있습니다.

근본적인 문제는 "인터넷에 연결할 수있다"는 것이 잘못 정의 된 질문이며, 이런 종류의 일은 다음과 같이 테스트하기가 어렵다는 것입니다.

  1. 사용자의 컴퓨터 및 "로컬"네트워킹 환경에 대한 정보 및
  2. 앱에 액세스 해야하는 내용에 대한 정보.

따라서 일반적으로 가장 간단한 솔루션은 앱이 액세스하는 데 필요한 모든 것에 액세스하고 진단을 수행하기 위해 인간 지능에 빠지는 것입니다.

Java 6에있는 경우 사용할 수 있습니다 네트워크 인터페이스 사용 가능한 네트워크 인터페이스를 확인합니다. 즉, 다음과 같은 것 :

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
  NetworkInterface interf = interfaces.nextElement();
  if (interf.isUp() && !interf.isLoopback())
    return true;
}

아직 직접 시도하지 않았습니다.

이 코드 :

"127.0.0.1".equals(InetAddress.getLocalHost().getHostAddress().toString());

반환 - 나에게 - true 오프라인 인 경우 false, 그렇지 않으면. (글쎄, 나는 이것이 모든 컴퓨터에 사실인지 모른다).

이것은 여기에서 다른 접근법보다 훨씬 빠르게 작동합니다.


편집 : 인터넷 연결에 대한 "플립 스위치"(랩톱에서) 또는 다른 시스템 정의 옵션이 꺼져있는 경우에만 작동하는 것으로 나타났습니다. 즉, 시스템 자체는 IP 주소를 찾지 않는다는 것을 알고 있습니다.

이 코드는 작업을 안정적으로 수행해야합니다.

사용할 때 try-with-resources 진술 우리는 자원을 닫을 필요가 없습니다.

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class InternetAvailabilityChecker
{
    public static boolean isInternetAvailable() throws IOException
    {
        return isHostAvailable("google.com") || isHostAvailable("amazon.com")
                || isHostAvailable("facebook.com")|| isHostAvailable("apple.com");
    }

    private static boolean isHostAvailable(String hostName) throws IOException
    {
        try(Socket socket = new Socket())
        {
            int port = 80;
            InetSocketAddress socketAddress = new InetSocketAddress(hostName, port);
            socket.connect(socketAddress, 3000);

            return true;
        }
        catch(UnknownHostException unknownHost)
        {
            return false;
        }
    }
}

나는 보통 그것을 세 단계로 나눕니다.

  1. 먼저 도메인 이름을 IP 주소로 해결할 수 있는지 확인합니다.
  2. 그런 다음 TCP (포트 80 및/또는 443)를 통해 연결하고 우아하게 닫으려고합니다.
  3. 마지막으로 HTTP 요청을 발행하고 200 응답을 확인하겠습니다.

언제라도 실패하면 사용자에게 적절한 오류 메시지를 제공합니다.

URL url=new URL("http://[any domain]");
URLConnection con=url.openConnection();

/*now errors WILL arise here, i hav tried myself and it always shows "connected" so we'll open an InputStream on the connection, this way we know for sure that we're connected to d internet */

/* Get input stream */
con.getInputStream();

위의 진술을 시도 캐치 블록에 넣고 잡힌 예외가 있으면 인터넷 연결이 설정되어 있지 않음을 의미합니다. :-)

NetworkInterface를 사용하여 네트워크를 기다리는 코드는 고정 네트워크 주소에서 DHCP로 전환 될 때까지 나에게 작동했습니다. 약간의 향상은 DHCP에서도 작동합니다.

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
    NetworkInterface interf = interfaces.nextElement();
    if (interf.isUp() && !interf.isLoopback()) {
    List<InterfaceAddress> adrs = interf.getInterfaceAddresses();
    for (Iterator<InterfaceAddress> iter = adrs.iterator(); iter.hasNext();) {
        InterfaceAddress adr = iter.next();
        InetAddress inadr = adr.getAddress();
        if (inadr instanceof Inet4Address) return true;
            }
    }
}

이것은 IPv4 네트워크 용 OpenSuse 13.1의 Java 7에서 작동합니다. 원래 코드의 문제점은 정지에서 재개 한 후 인터페이스가 Up이 발생했지만 IPv4 네트워크 주소는 아직 할당되지 않았다는 것입니다. 이 과제를 기다린 후 프로그램은 서버에 연결할 수 있습니다. 그러나 IPv6의 경우 어떻게 해야할지 모르겠습니다.

InetAddress.isReachable 인터넷 연결이 존재하면 언젠가 거짓을 반환합니다.

Java에서 인터넷 가용성을 확인하는 대체 방법은 다음과 같습니다. ICMP ECHO 핑.

public static boolean isReachableByPing(String host) {
     try{
                String cmd = "";
                if(System.getProperty("os.name").startsWith("Windows")) {   
                        // For Windows
                        cmd = "ping -n 1 " + host;
                } else {
                        // For Linux and OSX
                        cmd = "ping -c 1 " + host;
                }

                Process myProcess = Runtime.getRuntime().exec(cmd);
                myProcess.waitFor();

                if(myProcess.exitValue() == 0) {

                        return true;
                } else {

                        return false;
                }

        } catch( Exception e ) {

                e.printStackTrace();
                return false;
        }
}

1) 응용 프로그램을 어디에 연결 해야하는지 파악하십시오.

2) 점검 할 작업자 프로세스를 설정합니다 inetaddress.isreachable 해당 주소에 대한 연결을 모니터링합니다.

이 코드는 연결을 사용할 수 있는지 테스트하는 데 사용하는 Junit 테스트 클래스 내에 포함되어 있습니다. 항상 연결을받지 만 콘텐츠 길이를 확인하면 알 수없는 경우 -1이어야합니다.

  try {
    URL url = new URL("http://www.google.com");
    URLConnection connection = url.openConnection();

    if(connection.getContentLength() == -1){
          fail("Failed to verify connection");
    }
  } 
  catch (IOException e) {
      fail("Failed to open a connection");
      e.printStackTrace();
  }
public boolean checkInternetConnection()
{
     boolean status = false;
     Socket sock = new Socket();
     InetSocketAddress address = new InetSocketAddress("www.google.com", 80);

     try
     {
        sock.connect(address, 3000);
        if(sock.isConnected()) status = true;
     }
     catch(Exception e)
     {
         status = false;       
     }
     finally
     {
        try
         {
            sock.close();
         }
         catch(Exception e){}
     }

     return status;
}

Gradle 옵션도 있습니다 --offline 아마도 당신이 원하는 행동을 초래할 수 있습니다.

다음 코드 조각을 사용하면 Android 장치에서 네트워크 상태를 얻을 수 있습니다.

public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView mtv=findViewById(R.id.textv);
            ConnectivityManager connectivityManager=
                  (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if(((Network)connectivityManager.getActiveNetwork())!=null)
                    mtv.setText("true");
                else
                    mtv.setText("fasle");
            }
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top