如何成功获取外部IP

阅读后: 用Java获取“外部”IP地址

码:

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?

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

在运行以下代码之前,请查看以下内容: 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); } 
  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); } 

在玩Go时,我看到了你的问题。 我使用Go在Google App Engine上制作了一个快速应用程序:

点击此url:

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

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

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

wget以这种方式工作 :

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

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

希望这可以帮到你。

我们已经设置了CloudFlare并且按照设计,他们正在挑战不熟悉的使用者。 如果您可以将您的UA设置为常见的,您应该能够获得访问权限。

你可以使用这样的其他网络服务; http://freegeoip.net/static/index.html

使用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; } 

这就是我用rxJava2和Butterknife做的。 您将要在另一个线程中运行网络代码,因为您将在主线程上运行网络代码时遇到exception! 我使用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; }