자바에서 '외부'IP 주소 얻기


83

네트워크 외부의 컴퓨터에서 볼 수 있으므로 컴퓨터의 외부 IP 주소를 얻는 방법을 잘 모르겠습니다.

내 다음 IPAddress 클래스는 컴퓨터의 로컬 IP 주소 만 가져옵니다.

public class IPAddress {

    private InetAddress thisIp;

    private String thisIpAddress;

    private void setIpAdd() {
        try {
            InetAddress thisIp = InetAddress.getLocalHost();
            thisIpAddress = thisIp.getHostAddress().toString();
        } catch (Exception e) {
        }
    }

    protected String getIpAddress() {
        setIpAdd();
        return thisIpAddress;
    }
}

13
기계가 한 번에 많은 공용 주소를 가질 수 있다는 것을 알고 있습니까? 그들은 실제로 기계가 아닌 네트워크 인터페이스와 관련이 있습니다.
Donal Fellows

답변:


168

로컬 컴퓨터에서 실행되는 코드에서 해당 IP를 가져올 수 있는지 확실하지 않습니다.

그러나 JSP와 같이 웹 사이트에서 실행되는 코드를 빌드 한 다음 요청이 발생한 IP를 반환하는 코드를 사용할 수 있습니다.

request.getRemoteAddr()

또는 단순히이를 수행하는 기존 서비스를 사용한 다음 서비스에서 응답을 구문 분석하여 IP를 찾으십시오.

AWS 및 기타와 같은 웹 서비스 사용

import java.net.*;
import java.io.*;

URL whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = new BufferedReader(new InputStreamReader(
                whatismyip.openStream()));

String ip = in.readLine(); //you get the IP as a String
System.out.println(ip);


8
그 중 하나가 현재 다운 된 경우 (물론 올바른 오류 처리와 함께) IP를 제공하는 서버를 두 개 이상 구현하는 것이 좋습니다. 내 선택은 externalip.net입니다 ( "Need an API?"링크 클릭). 그 사이트를 1 년 넘게 사용하고 있으며 지금까지 아무런 문제가 없었으며 항상 빠른 응답을 제공하는 빠른 서비스입니다.

멋진 링크; 저는 이것을 대학 네트워킹 과제에 대한 개념 증명의 일부로 사용할 것입니다!
araisbec

또 다른 대안은 PHP를 실행하는 웹 서버 또는 호스트 계정에 액세스 할 수있는 경우 위에 제공된 @bakkal 코드를 사용하고 단순히 echo $_SERVER['REMOTE_ADDR'];. 이것이 스크립트의 유일한 또는 첫 번째 출력 라인이면 모든 설정이 완료된 것입니다.
Kingsolmn 2013 년

7
Whatsmyip.com은 더 이상 이러한 유형의 자동화를 지원하지 않는 것으로 보입니다.
Kingsolmn 2013 년

79

@stivlo의 댓글 중 하나가 답이 될 가치가 있습니다.

Amazon 서비스 http://checkip.amazonaws.com을 사용할 수 있습니다 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class IpChecker {

    public static String getIp() throws Exception {
        URL whatismyip = new URL("http://checkip.amazonaws.com");
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(
                    whatismyip.openStream()));
            String ip = in.readLine();
            return ip;
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

19

진실은 당신이 질문을 던졌다는 의미에서 '할 수 없다'는 것입니다. NAT는 프로토콜 외부에서 발생합니다. 컴퓨터의 커널이 NAT 상자가 외부에서 내부 IP 주소로 매핑되는 방식을 알 수있는 방법이 없습니다. 여기의 다른 답변은 외부 웹 사이트와 대화하는 방법과 관련된 트릭을 제공합니다.


3
아니면 원래의 질문에 답하지 않고 학문적 연습처럼 보입니다
Bruno Bossola 2015 년

공정하게 말하면이 답변은 질문에 대한 답변이며 다른 12 개의 답변은 모두 기본적으로 동일한 내용을 말하지만 외부 IP 검사기의 특정 선택에 해당하는 코드 또는 URL을 표시합니다.
Thomas Carlisle 19

14

이 모든 것이 아직 작동 중이며 원활하게 작동합니다! (2019 년 9 월 23 일 기준)

조언 : 그들 중 하나에 만 진지하게 의존하지 마십시오. 하나를 사용하고 다른 사람들을 고려하여 긴급 계획을 세우십시오! 더 많이 사용할수록 좋습니다!

행운을 빕니다!


12

@Donal Fellows가 작성했듯이 컴퓨터 대신 네트워크 인터페이스를 쿼리해야합니다. javadocs 의이 코드는 나를 위해 일했습니다.

다음 예제 프로그램은 시스템의 모든 네트워크 인터페이스와 해당 주소를 나열합니다.

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");
     }
} 

다음은 예제 프로그램의 샘플 출력입니다.

Display name: TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1

Display name: Wireless Network Connection
Name: eth0
InetAddress: /192.0.2.0

에서 docs.oracle.com


1
감사합니다! 이 솔루션은 소프트웨어가 NAT 뒤에있을 때는 작동하지 않지만 NAT 뒤에 있지 않을 것이라는 것을 알고있는 서버 소프트웨어에는 여전히 매우 유용합니다. 또는 소프트웨어가 다른 서버에 연결할 수없는 경우 대체 수단으로 자체적으로 사용할 수 있습니다. IP. 특히 인터넷 연결이 끊어진 LAN에서 실행되는 소프트웨어의 경우 갈 길입니다.
pavon

6

www.whatismyip.com과 같은 사이트에 HttpURLConnection을 만들고 파싱합니다. :-)


5

이건 어때? 그것은 간단하고 나를 위해 가장 잘 작동했습니다. :)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class IP {
    public static void main(String args[]) {
        new IP();
    }

    public IP() {
        URL ipAdress;

        try {
            ipAdress = new URL("http://myexternalip.com/raw");

            BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream()));

            String ip = in.readLine();
            System.out.println(ip);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이것은 훌륭합니다! 집에 가면해볼 게요. 이것이 바로 제가 찾던 문제 해결 방법입니다. 왜 더 높은 투표가되지 않았는지 모르겠습니다.
Adam893

4

http://jstun.javawi.de/ 가 수행합니다-게이트웨이 장치가 STUN을 수행하는 경우 대부분 수행)


1
흥미로운 점은 외부 서비스를 사용하지 않고 단순히 게이트웨이와 통신하지 않고도 예상대로 작동한다는 것입니다. 그러나 GPL 라이선스는 아마도 그것의 채택을 제한 할 것입니다.
Bruno Bossola 2015 년

사이트에 로그인 화면이 표시됩니다. 아마도 원본이 아닐 것입니다.
Jus12

1

LAN 내부의 기계는 일반적으로 인터넷에 대한 라우터의 외부 IP에 대해 신경 쓰지 않기 때문에 쉽지 않습니다. 단순히 필요하지 않습니다!

http://www.whatismyip.com/ 과 같은 사이트를 열고 html 결과를 구문 분석하여 IP 번호를 가져 와서 이것을 악용하는 것이 좋습니다 . 그렇게 어렵지 않아야합니다!


2
html을 구문 분석 할 필요가 없습니다. whatismyip.com 웹 페이지 소스의 첫 번째 줄은 외부 IP입니다.
Martijn Courteaux

0

JAVA 기반 웹앱을 사용하고 있고 클라이언트 (브라우저를 통해 요청하는 사람)의 외부 IP를 가져 오려면 공용 도메인에 앱을 배포하고 request.getRemoteAddr ()을 사용하여 외부 IP 주소를 읽으십시오.



0

대체 솔루션은 외부 명령을 실행하는 것입니다. 분명히이 솔루션은 애플리케이션의 이식성을 제한합니다.

예를 들어 Windows에서 실행되는 애플리케이션의 경우 다음 코드와 같이 jPowershell을 통해 PowerShell 명령을 실행할 수 있습니다.

public String getMyPublicIp() {
    // PowerShell command
    String command = "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()";
    String powerShellOut = PowerShell.executeSingleCommand(command).getCommandOutput();

    // Connection failed
    if (powerShellOut.contains("InvalidOperation")) {
        powerShellOut = null;
    }
    return powerShellOut;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.