Categories
JAVA

[Java] 현재 시스템의 IPv4기반의 IP주소 가져오기

Java에서 IP주소를 가져오는 방법은 매우 쉽고 간단합니다. 일반적으로 사용되는 간단한 방법으로는 다음과 같은 방법이 있습니다.
[code]InetAddress.getLocalHost().getAddress()[/code]
위의 단 한줄로 현재 시스템의 IP를 읽어올 수 있습니다. 그런데 개발시에는 문제가 없었는데 리눅스 서버에서 구동해 보니 127.0.0.1과 같이 loopback 주소가 나오는 경우가 있더군요. 찾아보다 다음과 같은 방법으로 깔끔하게 해결할 수 있었습니다.
[code]/**
 * 현재 서버의 IP 주소를 가져옵니다.
 *
 * @return IP 주소
 */
private String getLocalServerIp()
{
try
{
   for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
   {
       NetworkInterface intf = en.nextElement();
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
       {
           InetAddress inetAddress = enumIpAddr.nextElement();
           if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress())
           {
            return inetAddress.getHostAddress().toString();
           }
       }
   }
}
catch (SocketException ex) {}
return null;
}[/code]
현재 시스템의 모든 네트워크 인터페이스를 읽어와서 loopback장치인지 랜선에 연결된 장치인지 여부를 확인하여 실제 사용중인 인터페이스의 IP주소를 읽어오게 됩니다. 위와 같이 사용해서 실무에 적용해본 결과 어느 OS, 장치에 상관없이 IP가 정상적으로 출력되는것을 확인하였습니다.

소스코드가 좀 길고 더럽네요; 그냥 보관용으로 적어두는데 의미를 부여하겠습니다;;

Categories
Android

[Android] 네트워크 상태 정보 알아내는 유틸리티 클래스

안드로이드에서 네트워크 상태를 알아오는 클래스입니다. 서버와 통신을 하는 어플리케이션이라면 당연히 빠질수 없는 기능일것입니다. AndroidManifest.xml에 다음을 추가합니다.
[code xml]<uses-permission
  android:name=”android.permission.INTERNET”/>
<uses-permission
  android:name=”android.permission.ACCESS_NETWORK_STATE”/>[/code]
다음은 예제 코드입니다.
[code java]public class NetworkUtil
{
  public static final int NETWORK_WIFI = 0;
  public static final int NETWORK_3G = 1;
  public static final int NETWORK_NONE = 2;
 
  public static int checkStatus(Context context)
  {
    final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if(wifi.isAvailable())
    {
      return NETWORK_WIFI;
    }
    else if(mobile.isAvailable())
    {
      return NETWORK_3G;
    }
    else
    {
      return NETWORK_NONE;
    }

  }
}[/code]
이 소스는 제 취향대로 만들어 놓았지만 중요한것은 상단의 3줄입니다. CONNECTIVITY_SERVICE를 이용하여 네트워크 상태를 알아올 수 있습니다.

Exit mobile version