阅读后: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?
编辑:好的,所以它被拒绝了,其他人都知道另一个可以做同样功能的网站
答案 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;
}