如何成功获取外部IP

时间:2012-04-25 19:33:06

标签: java ip

阅读后:Getting the 'external' IP address in Java

代码:

public static void main(String[] args) throws IOException
{
    URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
    BufferedReader in = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

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

我以为我是赢家,但我收到以下错误

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: http://automation.whatismyip.com/n09230945.asp
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at getIP.main(getIP.java:12)

我认为这是因为服务器响应速度不够快,无论如何都要确保它能获得外部ip?

编辑:好的,所以它被拒绝了,其他人都知道另一个可以做同样功能的网站

9 个答案:

答案 0 :(得分:11)

    public static void main(String[] args) throws IOException 
    {
    URL connection = new URL("http://checkip.amazonaws.com/");
    URLConnection con = connection.openConnection();
    String str = null;
    BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
    str = reader.readLine();
    System.out.println(str);
     }

答案 1 :(得分:8)

在运行以下代码之前,请先看一下:http://www.whatismyip.com/faq/automation.asp

public static void main(String[] args) throws Exception {

    URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
    URLConnection connection = whatismyip.openConnection();
    connection.addRequestProperty("Protocol", "Http/1.1");
    connection.addRequestProperty("Connection", "keep-alive");
    connection.addRequestProperty("Keep-Alive", "1000");
    connection.addRequestProperty("User-Agent", "Web-Agent");

    BufferedReader in = 
        new BufferedReader(new InputStreamReader(connection.getInputStream()));

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

答案 2 :(得分:8)

在玩Go时,我看到了你的问题。我使用Go:

在Google App Engine上制作了一个快速应用程序

点击此网址:

http://agentgatech.appspot.com/

Java代码:

new BufferedReader(new InputStreamReader(new URL('http://agentgatech.appspot.com').openStream())).readLine()

转到您可以复制并制作自己的应用的应用代码:

package hello

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, r.RemoteAddr)
}

答案 3 :(得分:3)

403响应表示服务器由于某种原因明确拒绝了您的请求。有关详细信息,请联系WhatIsMyIP的运营商。

答案 4 :(得分:3)

某些服务器具有阻止来自“非浏览器”的访问的触发器。他们知道您是某种可以执行DOS attack的自动应用程序。为避免这种情况,您可以尝试使用lib访问资源并设置“浏览器”标题。

wget适用于此way

 wget  -r -p -U Mozilla http://www.site.com/resource.html

使用Java,您可以使用HttpClient lib并设置“User-Agent”标头。 查看“要尝试的事情”部分的主题5。

希望这可以帮到你。

答案 5 :(得分:3)

我们已经设置了CloudFlare,并按照设计挑战了不熟悉的使用者。如果您可以将UA设置为常用的UA,则应该能够访问。

答案 6 :(得分:2)

您可以使用其他类似的网络服务; http://freegeoip.net/static/index.html

答案 7 :(得分:2)

使用AWS上的Check IP地址链接为我工作。请注意,还要添加MalformedURLException,IOException

public String getPublicIpAddress() throws MalformedURLException,IOException {

    URL connection = new URL("http://checkip.amazonaws.com/");
    URLConnection con = connection.openConnection();
    String str = null;
    BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
    str = reader.readLine();


    return str;
}

答案 8 :(得分:0)

这是我用rxJava2和Butterknife做的。您将要在另一个线程中运行网络代码,因为您将在主线程上运行网络代码时遇到异常! 我使用rxJava而不是AsyncTask,因为当用户在线程完成之前移动到下一个UI时,rxJava会很好地清理。 (这对非常繁忙的用户界面非常有用)

public class ConfigurationActivity extends AppCompatActivity {

    // VIEWS
    @BindView(R.id.externalip) TextInputEditText externalIp;//this could be TextView, etc.

    // rxJava - note: I have this line in the base class - for demo purposes it's here
    private CompositeDisposable compositeSubscription = new CompositeDisposable();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_wonderful_layout);

        ButterKnife.bind(this);

        getExternalIpAsync();
    }

    // note: I have this code in the base class - for demo purposes it's here
    @Override
    protected void onStop() {
        super.onStop();
        clearRxSubscriptions();
    }

    // note: I have this code in the base class - for demo purposes it's here
    protected void addRxSubscription(Disposable subscription) {
        if (compositeSubscription != null) compositeSubscription.add(subscription);
    }

    // note: I have this code in the base class - for demo purposes it's here
    private void clearRxSubscriptions() {
        if (compositeSubscription != null) compositeSubscription.clear();
    }

    private void getExternalIpAsync() {
        addRxSubscription(
                Observable.just("")
                        .map(s -> getExternalIp())
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe((String ip) -> {
                            if (ip != null) {
                                externalIp.setText(ip);
                            }
                        })
        );
    }

    private String getExternalIp() {
        String externIp = null;
        try {
            URL connection = new URL("http://checkip.amazonaws.com/");
            URLConnection con = connection.openConnection(Proxy.NO_PROXY);
            con.setConnectTimeout(1000);//low value for quicker result (otherwise takes about 20secs)
            con.setReadTimeout(5000);
            BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            externIp = reader.readLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return externIp;
    }
}

更新 - 我发现URLConnection非常糟糕;它需要很长时间才能获得结果,而不是真正的超时等等。下面的代码改善了OKhttp的情况

private String getExternalIp() {
    String externIp = "no connection";
    OkHttpClient client = new OkHttpClient();//should have this as a member variable
    try {
        String url = "http://checkip.amazonaws.com/";
        Request request = new Request.Builder().url(url).build();
        Response response = client.newCall(request).execute();
        ResponseBody responseBody = response.body();
        if (responseBody != null) externIp = responseBody.string();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return externIp;
}