Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

자바 안드로이드에서 외부 IP를 핑(Ping)하여 네트워크 연결 확인하는 방법

안드로이드에서 외부 IP 핑(Ping) 테스트하기

이 예제는 자바(Java) 기반 안드로이드 앱에서 외부 IP 주소에 핑을 보내 실제 인터넷 연결 여부를 확인하는 방법을 소개합니다. 단순히 네트워크가 연결되어 있는지(Wi-Fi 또는 모바일 데이터)만 판단하는 것이 아니라, 구글 서버와 같은 외부 호스트에 실제로 도달할 수 있는지까지 검증할 수 있습니다.

1단계: 새 프로젝트 만들기

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력해 새 프로젝트를 생성합니다.

2단계: 레이아웃 파일 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

3단계: 메인 액티비티 코드 작성

src/MainActivity.java 파일에 아래 코드를 추가합니다. 이 코드는 현재 네트워크 상태(Wi-Fi, 모바일 데이터, 연결 없음)를 먼저 확인한 후, 구글 서버에 핑을 보내 실제 연결 가능 여부를 검사합니다.

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
    Boolean isConnected = false,
    isWiFi = false,
    isMobile = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ConnectivityManager cm = (ConnectivityManager)
            this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) {
            isWiFi = activeNetwork.getType() ==
                ConnectivityManager.TYPE_WIFI;
            isMobile = activeNetwork.getType() ==
                ConnectivityManager.TYPE_MOBILE;
            isConnected =
                activeNetwork.isConnectedOrConnecting();
        }
        if (isConnected) {
            if (isWiFi) {
                Toast.makeText(this, "Yes, WiF",
                    Toast.LENGTH_SHORT)
                    .show();
                if(isConnectedToThisServer("https://www.google.com/")) {
                    Toast.makeText(this, "Yes, Connected to
                        Google", Toast.LENGTH_SHORT)
                        .show();
                } else {
                    Toast.makeText(this, "No Google
                        Connection", Toast.LENGTH_SHORT)
                        .show();
                }
            }
            if (isMobile) {
                Toast.makeText(this, "Yes, Mobile",
                    Toast.LENGTH_SHORT)
                    .show();
                if(isConnectedToThisServer("https://www.google.com/")) {
                    Toast.makeText(this, "Yes, Connected to
                        Google", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "No Google
                       Connection", Toast.LENGTH_SHORT).show();
                }
            }
        } else {
            Toast.makeText(this, "No Network",
            Toast.LENGTH_SHORT).show();
        }
    }
    public boolean isConnectedToThisServer(String host) {
        Runtime runtime = Runtime.getRuntime();
        try {
            Process ipProcess = runtime.exec("/system/bin/ping
              -c 1 8.8.8.8" + host);
            int exitValue = ipProcess.waitFor();
            return (exitValue == 0);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return false;
    }
}

4단계: 매니페스트 권한 설정

AndroidManifest.xml 파일에 아래와 같이 네트워크 상태 접근 권한과 인터넷 권한을 반드시 선언해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission
        android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 결과를 확인해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바에서 Run 아이콘을 클릭하세요. 실행 옵션에서 본인의 모바일 기기를 선택하면, 기본 화면과 함께 네트워크 연결 상태가 토스트 메시지로 표시됩니다.

자바 안드로이드에서 외부 IP를 핑(Ping)하여 네트워크 연결 확인하는 방법

자바 안드로이드에서 외부 IP를 핑(Ping)하여 네트워크 연결 확인하는 방법

참고 사항

위 예제는 Runtime.exec()를 통해 시스템의 ping 명령어를 직접 호출하는 방식입니다. 일부 기기나 Android 버전에서는 이 명령어 경로가 존재하지 않거나 제한될 수 있으므로, 최신 프로젝트에서는 InetAddress.getByName(host).isReachable(timeout) 방식을 대안으로 고려하는 것이 좋습니다. 또한 네트워크 작업은 메인 스레드가 아닌 백그라운드 스레드에서 처리하는 것이 권장됩니다.