티스토리 뷰

TCP/IP 관련 프로젝트를 진행하다가 안드로이드를 서버로 사용해야 하는데, IP주소를 가져와야 클라이언트 측에서 Connect 할 수 있으므로 디바이스의 IP를 가져오는 코드를 찾던중에 아래와 같은 코드를 발견했는데, SDK의 문제인지 해당 코드가 안먹어서 Stack overflow를 참고하여 문제를 해결할 수 있었다.


비슷한 문제로 삽질하던 분에게 도움이 되길


안드로이드 개발코드 중, IP Address를 가져오데 가장 많이 이용되는 코드는 아래와 같습니다.


헌데, 그냥 Copy + Paste만 하면 싱거워서 약간의 해설을 달아봤습니다.


전체적인 코드와 주석은 아래와 같습니다. 

 
//Device에 있는 모든 네트워크에 대해 뺑뺑이를 돕니다. 
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
    NetworkInterface intf = en.nextElement(); 
     
    //네트워크 중에서 IP가 할당된 넘들에 대해서 뺑뺑이를 한 번 더 돕니다. 
    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
         
        InetAddress inetAddress = enumIpAddr.nextElement(); 
         
        //네트워크에는 항상 Localhost 즉, 루프백(LoopBack)주소가 있으며, 우리가 원하는 것이 아닙니다. 
        //IP는 IPv6와 IPv4가 있습니다.  
        //IPv6의 형태 : fe80::64b9::c8dd:7003 
        //IPv4의 형태 : 123.234.123.123 
        //어떻게 나오는지는 찍어보세요. 
        if(inetAddress.isLoopbackAddress()) { 
            Log.i("IPAddress", intf.getDisplayName() + "(loopback) | " + inetAddress.getHostAddress()); 
        } 
        else 
        { 
            Log.i("IPAddress", intf.getDisplayName() + " | " + inetAddress.getHostAddress()); 
        } 
         
        //루프백이 아니고, IPv4가 맞다면 리턴~~~ 
        if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) { 
            return inetAddress.getHostAddress().toString(); 
        } 
    } 
} 

○ 추가적인 설명 
  1) IP를 찍어보면 아래와 같이 나오게 됩니다.
   
    루프백(로컬호스트)에 대해 IPv6와 IPv4가 나옵니다.
    그리고 연결된 LTE(rmnet0)에 대해서 IPv6, IPv4 역시 나오게 됩니다.



이 부분에서 InetAddressUtils 가 import도 안되고 사용할 수 도 없었는데


if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { 
return inetAddress.getHostAddress().toString();
}
이렇게 수정해서 완료할 수 있었다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함