Intereting Posts
Какая лицензия (ы) – это библиотеки поддержки Android, выпущенные под? Почему функция getBackStackEntryCount () возвращает значение FragmentManager? Android Google SignIn не работает в режиме отладки: GoogleSignInResult является ложным Viewpager setonpagechangelistener устарел Как воспроизводить видео на YouTube в приложении для Android? Как установить двустороннюю связь между Activity и Service в разных процессах? Разница между armeabi и armeabi-v7a Как сделать DrawerLayout отображаться под панелью инструментов? IllegalArgumentException: недопустимый столбец Android Realm copyToRealmOrUpdate создает дубликаты вложенных объектов Не удалось подключиться к заводскому клиенту – борьба с Google Maps Android. Несколько раз создавайте фрагмент? Как вы рисуете текст с рамкой на MapView в Android? Android: Можно запустить несколько экземпляров Activity в одной и той же задаче? Отображение текста (например, оценка), который изменяется на каждом кадре

Определение общедоступного устройства ip

Кто-нибудь знает, как я могу получить общедоступный IP-адрес устройства Android?

Я пытаюсь запустить серверный сокет (просто экспериментируя с простым p2p).

Это требует информирования локальных и удаленных пользователей общедоступных IP-адресов. Я нашел этот поток Как получить IP-адрес устройства из кода? Который содержит ссылку на статью ( http://www.droidnova.com/get-the-ip-address-of-your-device,304.html ), которая показывает, как получить IP-адрес. Однако это возвращает локальный ip при подключении через маршрутизатор, и я хотел бы получить фактический публичный IP вместо этого.

ТИА

Solutions Collecting From Web of "Определение общедоступного устройства ip"

Просто зайдите на сайт http://automation.whatismyip.com/n09230945.asp и очистите его?

Whatismyip.com идеально подходит для получения IP- адреса , хотя сайт требует, чтобы вы его касались только раз в 5 минут.

UPDATE FEB 2015

WhatIsMyIp теперь предоставляет API-интерфейс разработчика, который вы можете использовать.

Разберите общедоступный IP-адрес с помощью checkip.org (с помощью JSoup ):

public static String getPublicIP() throws IOException { Document doc = Jsoup.connect("http://www.checkip.org").get(); return doc.getElementById("yourip").select("h1").first().select("span").text(); } 

Чтобы найти общедоступный IP-адрес, вам необходимо вызвать внешнюю службу, например http://www.whatismyip.com/, и получить внешний IP-адрес в качестве ответа.

В общем случае вы не можете. Вполне возможно, что устройство не имеет общедоступного IP-адреса (или, по крайней мере, не того, с которым вы можете открыть соединение). Если он подключается через NAT-маршрутизатор, он не будет иметь его.

IP-адрес, возвращаемый инструментом, например http://touch.whatsmyip.org/, будет адресованным публике адресом NAT-маршрутизатора, а не устройства.

Большинство домашних и корпоративных сетей используют NAT-маршрутизаторы, как и многие мобильные операторы.

 private class ExternalIP extends AsyncTask<Void, Void, String> { protected String doInBackground(Void... urls) { String ip = "Empty"; try { HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet("http://wtfismyip.com/text"); HttpResponse response; response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { long len = entity.getContentLength(); if (len != -1 && len < 1024) { String str = EntityUtils.toString(entity); ip = str.replace("\n", ""); } else { ip = "Response too long or error."; } } else { ip = "Null:" + response.getStatusLine().toString(); } } catch (Exception e) { ip = "Error"; } return ip; } protected void onPostExecute(String result) { // External IP Log.d("ExternalIP", result); } } 

Вот мой путь, я это делаю.

У меня есть записи DNS

Ip4 IN A 91.123.123.123

Ip6 IN AAAA 1234: 1234: 1234: 1234 :: 1

Затем у меня есть PHP-скрипты на моем сайте с поддержкой PHP. (Вам необходимо адаптировать этот скрипт)

 < ?PHP echo $_SERVER['REMOTE_ADDR'];? > 

Если я позвоню ip6.mydomain.com/ip/, у меня есть IPv6 публичный ip. Если я позвоню ip4.mydomain.com/ip/, у меня есть IPv4 public ip.

Тогда у меня есть следующий класс java.

 public class IPResolver { private HttpClient client = null; private final Context context; public IPResolver(Context context) { this.context = context; } public String getIp4() { String ip4 = getPage("http://ip4.mysite.ch/scripts/ip"); return ip4; } public String getIp6() { String ip6 = getPage("http://ip6.mysite.ch/scripts/ip"); return ip6; } private String getPage(String url) { // Set params of the http client if (client == null) { HttpParams httpParameters = new BasicHttpParams(); int timeoutConnection = 2000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); int timeoutSocket = 2000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); client = new DefaultHttpClient(httpParameters); } try { HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); String html = ""; InputStream in = response.getEntity().getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(in)); StringBuilder str = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { str.append(line); } in.close(); html = str.toString(); return html.trim(); } catch (Throwable t) { // t.printStackTrace(); } return null; } } 

Это продолжение для ответа Eng.Fouad , который посредством Parse публичного IP-адреса с checkip.org (с использованием JSoup ) ::

Метод (если вы получаете ошибку исключения из предыдущего метода):

 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.IOException; ********** public static String getPublicIp() { String myip=""; try{ Document doc = Jsoup.connect("http://www.checkip.org").get(); myip = doc.getElementById("yourip").select("h1").first().select("span").text(); } catch(IOException e){ e.printStackTrace(); } return myip; } 

Пример метода вызова:

 <your class name> wifiInfo = new <your class name>(); String myIP = wifiInfo.getPublicIp(); 

Скомпилируйте следующую библиотеку в ваших зависимостях build.gradle

 compile 'org.jsoup:jsoup:1.9.2' 

JSoup скомпилирован с использованием Java API версии 8, поэтому добавьте следующее внутри build.gradle defaultConfig {}

 jackOptions{ enabled true } 

И изменить параметр компиляции:

  compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 

И последнее, но не менее важное: поместите следующий код под метод onCreate (), так как по умолчанию вы не должны запускать сетевую операцию с помощью пользовательского интерфейса (рекомендуется через службы или AsyncTask), а затем перестраивать код.

 StrictMode.enableDefaults(); 

Протестировано и работает над Lolipop и Kitkat.

Я просто делаю HTTP GET для ipinfo.io/ip

Вот реализация:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.HttpURLConnection; public class PublicIP { public static String get() { return PublicIP.get(false); } public static String get(boolean verbose) { String stringUrl = "https://ipinfo.io/ip"; try { URL url = new URL(stringUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); if(verbose) { int responseCode = conn.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); } StringBuffer response = new StringBuffer(); BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); if(verbose) { //print result System.out.println("My Public IP address:" + response.toString()); } return response.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { System.out.println(PublicIP.get()); } } 

Я использую FreeGeoIP и получаю IP-> GEO.

 http://freegeoip.net/json 

Другое решение сравнивается с whatismyip

Я использую эту функцию для получения общедоступного IP-адреса, сначала проверьте, есть ли связь, а затем запросите запрос на возврат общедоступного IP-адреса

 public static String getPublicIPAddress(Context context) { //final NetworkInfo info = NetworkUtils.getNetworkInfo(context); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo info = cm.getActiveNetworkInfo(); RunnableFuture<String> futureRun = new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { if ((info != null && info.isAvailable()) && (info.isConnected())) { StringBuilder response = new StringBuilder(); try { HttpURLConnection urlConnection = (HttpURLConnection) ( new URL("http://checkip.amazonaws.com/").openConnection()); urlConnection.setRequestProperty("User-Agent", "Android-device"); //urlConnection.setRequestProperty("Connection", "close"); urlConnection.setReadTimeout(15000); urlConnection.setConnectTimeout(15000); urlConnection.setRequestMethod("GET"); urlConnection.setRequestProperty("Content-type", "application/json"); urlConnection.connect(); int responseCode = urlConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { response.append(line); } } urlConnection.disconnect(); return response.toString(); } catch (Exception e) { e.printStackTrace(); } } else { //Log.w(TAG, "No network available INTERNET OFF!"); return null; } return null; } }); new Thread(futureRun).start(); try { return futureRun.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); return null; } } 

Конечно, его можно оптимизировать, я оставляю его для мастеров, которые вносят свои решения.

Используя org.springframework.web.client.RestTemplate и Amazon API, вы можете легко получить свой публичный IP-адрес.

 public static String getPublicIP() { try { RestTemplate restTemplate = new RestTemplate(); return restTemplate.getForObject("http://checkip.amazonaws.com/", String.class).replace("\n",""); } catch ( Exception e ) { return ""; } } 
  public class getIp extends AsyncTask<String, String, String> { String result; @Override protected String doInBackground(String... strings) { CustomHttpClient client = new CustomHttpClient(); try { result = client.executeGet("http://checkip.amazonaws.com/"); } catch (Exception e) { e.printStackTrace(); } return result; } } 

И звонить в любую точку

 try { ip = new getIp().execute().get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } 

CustomHttpClient.java

 import android.graphics.Bitmap; import android.graphics.BitmapFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.params.ConnPerRouteBean; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.impl.auth.BasicScheme; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; public class CustomHttpClient { private static HttpClient custHttpClient; public static final int MAX_TOTAL_CONNECTIONS = 1000; public static final int MAX_CONNECTIONS_PER_ROUTE = 1500; public static final int TIMEOUT_CONNECT = 150000; public static final int TIMEOUT_READ = 150000; public static HttpClient getHttpClient() { if (custHttpClient == null) { SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443)); HttpParams connManagerParams = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(connManagerParams, MAX_TOTAL_CONNECTIONS); ConnManagerParams.setMaxConnectionsPerRoute(connManagerParams, new ConnPerRouteBean(MAX_CONNECTIONS_PER_ROUTE)); HttpConnectionParams.setConnectionTimeout(connManagerParams, TIMEOUT_CONNECT); HttpConnectionParams.setSoTimeout(connManagerParams, TIMEOUT_READ); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry); custHttpClient = new DefaultHttpClient(cm, null); HttpParams para = custHttpClient.getParams(); HttpConnectionParams.setConnectionTimeout(para, (30 * 10000)); HttpConnectionParams.setSoTimeout(para, (30 * 10000)); ConnManagerParams.setTimeout(para, (30 * 10000)); } return custHttpClient; } public static String executePost(String urlPostFix,ArrayList<NameValuePair> postedValues) throws Exception { String url = urlPostFix; BufferedReader in = null; try { System.setProperty("http.keepAlive", "false"); HttpClient client = getHttpClient(); HttpPost request = new HttpPost(url); request.setHeader("Accept", "application/json"); request.setHeader("Content-Type", "application/x-www-form-urlencoded"); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postedValues); formEntity.setContentType("application/json"); request.setEntity(formEntity); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); return result; } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } } public static String executeGet(String urlPostFix) throws Exception { String url = urlPostFix; BufferedReader in = null; try { HttpClient client = getHttpClient(); HttpGet request = new HttpGet( url); request.setHeader("Accept", "application/json"); request.setHeader("Content-Type", "application/x-www-form-urlencoded"); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); return result; } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } } public static Bitmap executeImageGet(String urlPostFix) throws Exception { String url = urlPostFix; InputStream in = null; try { HttpClient client = getHttpClient(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); in = bufHttpEntity.getContent(); Bitmap bitmap = BitmapFactory.decodeStream(in); in.close(); return bitmap; } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } } } 
 public class Test extends AsyncTask { @Override protected Object doInBackground(Object[] objects) { URL whatismyip = null; try { whatismyip = new URL("http://icanhazip.com/"); try { BufferedReader in = new BufferedReader(new InputStreamReader( whatismyip.openStream())); String ip = in.readLine(); //you get the IP as a String Log.i(TAG, "EXT IP: " + ip); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } return null; } }