Java 사용 내 PC의 로컬 IP 주소를 찾으려고했습니다. 그러나 결과가 올바르지 않습니다. 구체적으로 말하면 ipconfig
명령에서 무선 LAN 어댑터 WiFi IPv4 주소가 필요합니다. this excellent answer과 같은 여러 가지 질문을 살펴 보았지만 Java에서이 작업을 수행하는 방법이 명확하지 않았습니다. InetAddress.getLocalHost()
잘못된 IP를 반환합니다 ('이더넷 어댑터 VirtualBox 호스트 전용 네트워크').거짓 긍정없이 로컬 컴퓨터 IP 주소 찾기
public static List<String> getLocalIPAddresses() throws Exception
{
val networkInterfaces = NetworkInterface.getNetworkInterfaces();
val localIPAddresses = new ArrayList<String>();
while (networkInterfaces.hasMoreElements())
{
for (val interfaceAddress : networkInterfaces.nextElement().getInterfaceAddresses())
{
val address = interfaceAddress.getAddress();
// Find the local IP addresses
if (address.isSiteLocalAddress())
{
val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
localIPAddresses.add(localIPAddress);
}
}
}
if (localIPAddresses.isEmpty())
{
throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
}
return localIPAddresses;
}
참고 :
val
이 Lombok
에서입니다
이이 개 IP 주소 목록을 반환
192.168.56.1
192.168.2.103
'이더넷 어댑터 버추얼 호스트 전용 네트워크'하나 올바른 '무선 LAN 어댑터 와이파이'한. 나는 항상 후자를 보장하기 위해 무엇을 할 수 있습니까? 외관상으로는 isSiteLocalAddress()
(a.k.a 로컬 IP 주소)을 검사하는 것만으로는 충분하지 않습니다. 코드에 따라 그 밖의 무엇을 할 수 있습니까? 'VirtualBox'를 필터링하는 것은 특히 네트워크 인터페이스 이름이 언어에 따라 다르기 때문에 절대 안전한 해결책은 아닙니다.
public static List<String> getLocalIPAddresses() throws Exception
{
val networkInterfaces = NetworkInterface.getNetworkInterfaces();
val localIPAddresses = new ArrayList<String>();
while (networkInterfaces.hasMoreElements())
{
val networkInterface = networkInterfaces.nextElement();
val displayName = networkInterface.getDisplayName();
if (!displayName.contains("VirtualBox"))
{
for (val interfaceAddress : networkInterface.getInterfaceAddresses())
{
val address = interfaceAddress.getAddress();
// Find the local IP addresses
if (address.isSiteLocalAddress())
{
val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
localIPAddresses.add(localIPAddress);
}
}
}
}
if (localIPAddresses.isEmpty())
{
throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
}
return localIPAddresses;
}
플랫폼 독립적 솔루션이 필요합니다. 나는 Windows에있어.
두 IP가 같은 networkInterface에 있습니까? 그렇지 않다면 networkIntreface.isVirtual()과 같은 부울 테스트와 인터페이스를 구별 할 수 있습니까? –
@MichaelMcKay : isVirtual() 검사를 포함시킨 후에도 코드는 여전히 2 개의 IP를 반환합니다. 그들은 각각 다른 네트워크 인터페이스에 있습니다. – BullyWiiPlaza
"InetAddress.getLocalHost()가 잘못된 IP를 반환하는 경우"를 사용하여 for 루프에서 필터링 할 수 있습니까? –