2010-05-16 3 views
7

Java를 사용하여 컴퓨터의 LAN IP 주소를 얻으려면 어떻게해야합니까? 나는 라우터와 네트워크의 나머지 부분에 연결된 IP 주소를 원한다.Java를 사용하여 클라이언트의 LAN IP를 얻는 방법은 무엇입니까?

Socket s = new Socket("www.google.com", 80); 
String ip = s.getLocalAddress().getHostAddress(); 
s.close(); 

이 어떤 경우에 작동하는 것, 그러나 때때로 그것은 루프백 주소 또는 완전히 다른 무언가를 반환

나는 이런 식으로 뭔가를 시도했습니다. 또한 인터넷 연결이 필요합니다.

누구든지이 작업을 수행하는보다 정확한 방법이 있습니까?

편집 :이 코멘트에 비해 여기 물어 더 좋을 거라 생각 .. 당신이 많은 인터페이스를 가지고하면 어떻게

? 예를 들어 케이블 용, Wi-Fi 용, 가상 박스 용 등이 있습니다. 어떤 것이 네트워크에 연결되어 있는지 실제로 볼 수 있습니까?

답변

15

을 시도해보십시오 java.net.NetworkInterface

import java.net.NetworkInterface; 

... 

for (
    final Enumeration<NetworkInterface> interfaces = 
     NetworkInterface.getNetworkInterfaces(); 
    interfaces.hasMoreElements(); 
) 
{ 
    final NetworkInterface cur = interfaces.nextElement(); 

    if (cur.isLoopback()) 
    { 
     continue; 
    } 

    System.out.println("interface " + cur.getName()); 

    for (final InterfaceAddress addr : cur.getInterfaceAddresses()) 
    { 
     final InetAddress inet_addr = addr.getAddress(); 

     if (!(inet_addr instanceof Inet4Address)) 
     { 
      continue; 
     } 

     System.out.println(
      " address: " + inet_addr.getHostAddress() + 
      "/" + addr.getNetworkPrefixLength() 
     ); 

     System.out.println(
      " broadcast address: " + 
       addr.getBroadcast().getHostAddress() 
     ); 
    } 
} 
+3

+1 if (cur.isLoopback()) – aioobe

+0

많은 인터페이스가 있다면? 예를 들어 케이블 용, Wi-Fi 용, 가상 박스 용 등이 있습니다. 네트워크에 어느 것이 연결되어 있는지 실제로 파악하는 것은 불가능합니까? – cragiz

+0

@Henrik. 이 경우 모두가 '연결'됩니다. 어느 것이 외부 라우팅에 사용될 것인지 결정하는 것은 OS에 달려 있습니다. 이 소켓 생성자는 http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#Socket(java.net.InetAddress,%20int,%20java.net)을 사용할 수 있습니다. InetAddress, % 20int) 특정 로컬 주소와 포트를 선택하거나 기본 소켓을 구성하여 특정 인터페이스에 바인딩합니다. 또한 NetworkInterface 객체에서 필요한 정보를 확인할 수 있는지 확인하십시오. –

7

처음에는 단일 주소가 없습니다. 컴퓨터에 적어도 두 개의 주소가 있습니다 ("lo"에 127.0.0.1, "eth1"에 192.168.1.1).

당신이 원하는 :이 라우팅 테이블의 잠재적 복잡한 구문 분석을 필요로하기 때문에 당신이, 당신은 자동으로 라우터 중 하나에 연결되어있는 하나의 감지 할 수없는 예상을했던 것으로서 Listing network interfaces

. 그러나 만약 당신이 단지 비 - 지역 주소를 원한다면 이것은 충분해야합니다. IPv6 주소를 추가하기 때문에 Vista 또는 Windows 7에서 적어도 한 번 이상 사용해보십시오. 이것은 내가 사용 한 방법이다

Display name: bge0 
Name: bge0 
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2 
InetAddress: /121.153.225.59 

Display name: lo0 
Name: lo0 
InetAddress: /0:0:0:0:0:0:0:1%1 
InetAddress: /127.0.0.1 
0
try { 
    InetAddress addr = InetAddress.getLocalHost(); 

    // Get IP Address 
    byte[] ipAddr = addr.getAddress(); 

    // Get hostname 
    String hostname = addr.getHostName(); 
} catch (UnknownHostException e) { 
} 
1

다음

import java.io.*; 
import java.net.*; 
import java.util.*; 
import static java.lang.System.out; 

public class ListNets 
{ 
    public static void main(String args[]) throws SocketException { 
     Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
     for (NetworkInterface netint : Collections.list(nets)) 
      displayInterfaceInformation(netint); 
    } 

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { 
     out.printf("Display name: %s\n", netint.getDisplayName()); 
     out.printf("Name: %s\n", netint.getName()); 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      out.printf("InetAddress: %s\n", inetAddress); 
     } 
     out.printf("\n"); 
    } 
} 

예제 프로그램의 샘플 출력을하다 동안. 외부에서 볼 수있는 IP 주소도 알아낼 수있는 약간의 해킹이 포함되어 있습니다.

private List<String> getLocalHostAddresses() { 

    List<String> addresses = new ArrayList<String>(); 

    try { 
     Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); 

     while (e.hasMoreElements()) { 
      NetworkInterface ni = e.nextElement(); 
      Enumeration<InetAddress> e2 = ni.getInetAddresses(); 
      while (e2.hasMoreElements()) 
       addresses.add(e2.nextElement().getHostAddress()); 
     } 
     URL u = new URL("http://whatismyip.org"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       u.openStream())); 
     addresses.add(in.readLine()); 
     in.close(); 
    } catch (Exception ignore) { 
    } 

    return addresses; 
} 
0

다니엘은 이미 지적했듯이 어떤 인터페이스가 "연결된"인터페이스인지 알 수 없습니다. 예를 들어 컴퓨터에 두 개의 물리적 LAN에 연결된 여러 개의 네트워크 인터페이스 카드가있는 경우에는 어떻게됩니까?

사용자가 사용 사례에 따라 사용할 인터페이스를 결정하거나 모두 사용해보십시오.