2009-10-02 2 views
9

Java 애플릿에서 로컬 IP 주소를 확인하고 싶습니다. 문제는 LAN과 인터넷 연결 (palm, VMWare ...)이있는 동일한 컴퓨터에 여러 IP 주소가있는 경우입니다.Java 애플릿에서 올바른 로컬 IP 주소를 가져옵니다.

public static void main(String[] args) { 
     try { 
     String hostName = InetAddress.getLocalHost().getHostName(); 
     System.out.println("HostName = " + hostName); 
     System.out.println("HostAddressLocal = " + 
      InetAddress.getLocalHost().getHostAddress()); 
     InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); 
     for (InetAddress inetAddress : inetAddresses) { 
      System.out.println("hostAddress = " + inetAddress.getHostAddress()); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

결과는 다음과 같습니다 :

여기 내 테스트입니다

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

xx.xx.xx.xx이 올바른 주소가 아닙니다. 올바른 것은 10.10.11.51입니다. jarnbjo에 응답


편집 :

귀하의 수정 구슬은 진실을 말한다. 당신은 내 문제를 이해했습니다. 클라이언트는 프록시를 통해 연결할 수 있으므로 첫 번째 지점을 사용할 수 없습니다. 내 컴퓨터에서 다음이 코드를 실행하면 : getHostName의 하단에서

Internet IP = /127.0.0.1 

그리고하지 10.10.11.51

+0

애플릿입니까? 기본 및 로컬 UP 주소에 액세스 할 수 있습니까? –

+0

그 문제도있었습니다. – KLE

+3

정확히 무엇을하려고합니까? 왜이 정보가 필요한가요? 사용자에게 로컬 주소가없는 경우에는 어떻게해야합니까? 사용자가 많은 인터페이스와 많은 로컬 주소를 가지고 있으면 어떻게 될까요? 사용자가 IPv6을 사용한다면 (각 인터페이스는 잠재적으로 많은 주소를 가질 수 있습니다)? 프로그램에 몇 가지 디자인 문제가 있습니다. 올바르게 작동하려면이 특성에 의존해서는 안됩니다. – Juliano

답변

-1

() C 함수 gethostbyname까지도() :

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

을 나는이 결과를 가지고있다. 처음에는/etc/hosts를보고 DNS를 통해 해결하려고했습니다. 따라서, 10.10.11.51 myhostname을/etc/hosts에 추가하면 getHostName()은 정확하게 감지해야합니다. Windows의 경우/etc/hosts, AFAIR은 \ WINDOWS \ System32 \ Servises에 있습니다.

이는 이름 확인 문제 일뿐입니다.

코드에서 호스트 이름 (hostName = InetAddress.getLocalHost(). getHostName();)을 먼저 얻습니다. 이 함수는 시스템 설치시 설정된 컴퓨터 이름을 반환합니다. 콘크리트 호스트 이름의 모든 IP (InetAddress.getAllByName 이름 (hostname)) 그리고 당신이 얻을 -이 반환하는 모든 IP는이 호스트 이름

간단한 예를 들어 해결

1의/etc /이

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
같은 호스트

코드 반환

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

이 변화/etc/hosts 파일은

처럼 보이게하기 내 우분투 상자의 이름 -
 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

코드는

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

프레드 - 바탕 화면을 반환합니다.

+0

그게 질문이 아니 었습니다. 문제는 이름 확인이 아니라 여러 인터페이스가있을 수 있다는 사실입니다. – sleske

+0

답변도주의를 기울이지 않아도 매우 나쁜 투표 ... –

+0

질문은 자바에 대한 것이고 다른 목적으로 C 호출을합니다. – Mark

11

이미 알았 듯이 컴퓨터에는 IP 주소가 다른 여러 개의 네트워크 인터페이스가있을 수 있습니다. 어느 것이 실제로 올바른지를 "정확함"으로 생각하는 것이 조금 어렵습니다.

내 수정 구슬은 클라이언트가 애플릿이로드 된 서버에 연결하는 데 사용하는 IP 주소를 의미한다고 제안합니다. 서버에서

  • , 당신은 동적으로 생성 된 HTML 페이지에 애플릿을 포함하고 애플릿 매개 변수로 클라이언트의 IP 주소를 추가 할 수 있습니다 : 그렇다면, 당신은 적어도 두 가지 가능성이있다. 적어도 프록시를 통해 HTTP를 사용하지 않는다면 웹 서버는 클라이언트의 IP 주소를 확인하고이를 애플릿에 전달할 수 있어야합니다.

    애플릿에서
  • , 당신은 당신이 애플릿을로드 한 웹 서버에 TCP 소켓을 열고 연결에 사용되는 로컬있는 주소를 확인할 수 있습니다

합니다.

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

감사합니다. 질문에서 편집을 참조하십시오. – EFalco

+0

이것은 일반적으로 기본 샌드 박스 모드에서 보안 권한이 없기 때문에 요즘에는 애플릿에서 작동하지 않습니다. 애플릿의 [정책 파일]에 [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html)을 부여해야합니다. ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html). –

+0

"www"에 대한 소켓을 만드는 작업이 중단되었습니다. 제 질문을 참조하십시오 : http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- 승인 –