Java получает мой IP-адрес
Я пытаюсь получить свой IP-адрес в Интернете на Java, но я продолжаю получать свой локальный адрес (например: 127.0.0.1), когда мой IP-адрес равен 192.168.0.xxx
Я использую строку:
InetAddress.getLocalHost().getHostAddress();
который кажется стандартным для получения IP-адреса, но это не то, что я ищу. В каждом учебнике говорится, что нужно использовать эту строку, поэтому я немного запутался.
Может кто-нибудь, пожалуйста, дайте мне знать, как я могу получить свой правильный IP-адрес, пожалуйста?
Я запускаю устройство, подключенное к Wi-Fi, и я не использую какой-либо кабель. Я подключаюсь к серверу, используя IP, заданный ifconfig inet addr, и я ищу, чтобы получить inet addr устройства. Я мог проверить IP-адрес сокета на стороне сервера, но подумал, что было бы лучше, если устройство (клиент) сообщает серверу, какой IP-адрес он ожидает от других устройств для подключения.
Ответы
Ответ 1
Класс NetworkInterface
содержит все соответствующие методы, но имейте в виду, что нет такой вещи, как "мой IP". Машина может иметь несколько интерфейсов, и каждый интерфейс может иметь несколько IP-адресов.
Вы можете перечислить их все с помощью этого класса, но какой интерфейс и IP вы выбираете из списка, зависит от того, что именно вам нужно использовать для этого IP для.
(InetAddress.getLocalHost()
не обращается к вашим интерфейсам, он просто возвращает константу 127.0.0.1 (для IPv4))
Ответ 2
String ip;
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
// filters out 127.0.0.1 and inactive interfaces
if (iface.isLoopback() || !iface.isUp())
continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while(addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
ip = addr.getHostAddress();
System.out.println(iface.getDisplayName() + " " + ip);
}
}
} catch (SocketException e) {
throw new RuntimeException(e);
}
Ответ 3
Позвольте спросить AWS
URL url = new URL("http://checkip.amazonaws.com/");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
System.out.println(br.readLine());
ИЗМЕНИТЬ
Перед тем, как спустить вниз, я хорошо знаю, что это не Java-решение. Это общее решение для любого языка программирования. Другие решения для меня тоже не работают. Также я считаю, что более простой способ узнать свой IP-адрес - пойти в Интернет. Это может быть любой сайт, сервер может вернуть обратно ваш IP-адрес клиента, который он получил в запросе. Вы можете настроить для него свою конечную точку.
Ответ 4
Еще один вариант для сетевого интерфейса по умолчанию, просто я пытался 5 минут назад и увидел ваш вопрос:)
InetAddress[] localaddr;
try {
localaddr = InetAddress.getAllByName("host.name");
for(int i = 0; i < localaddr.length; i++){
System.out.println("\n" + localaddr[i].getHostAddress());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
Ответ 5
С той же проблемой нашел решение на этой странице: http://mrhawy.blogspot.it/2012/05/how-to-get-your-external-ip-address-in.html
public String getIpAddress() throws MalformedURLException, IOException {
URL myIP = new URL("http://api.externalip.net/ip/");
BufferedReader in = new BufferedReader(
new InputStreamReader(myIP.openStream())
);
return in.readLine();
}
имел некоторые проблемы с этим кодом в долгосрочной перспективе, несколько раз в неделю сервер просто не отвечает.
новое решение:
public static String getIpAddress()
{
URL myIP;
try {
myIP = new URL("http://api.externalip.net/ip/");
BufferedReader in = new BufferedReader(
new InputStreamReader(myIP.openStream())
);
return in.readLine();
} catch (Exception e)
{
try
{
myIP = new URL("http://myip.dnsomatic.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(myIP.openStream())
);
return in.readLine();
} catch (Exception e1)
{
try {
myIP = new URL("http://icanhazip.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(myIP.openStream())
);
return in.readLine();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
return null;
}
Ответ 6
//This program is find your exact LAN(Local Machine on which your are //runing this program) IP Address
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetMyIPAddress {
public static void main(String gks[]) throws SocketException{
Enumeration e = NetworkInterface.getNetworkInterfaces();
int ctr=0;
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements() && ctr<3)
{ ctr++;
if(ctr==3)
break;
InetAddress i = (InetAddress) ee.nextElement();
if(ctr==2)
System.out.println(i.getHostAddress());
}
}
}
}
Ответ 7
Мое решение, которое возвращает только 1 адрес Ip4:
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
if (iface.isLoopback() || !iface.isUp() || iface.isVirtual() || iface.isPointToPoint())
continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while(addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
final String ip = addr.getHostAddress();
if(Inet4Address.class == addr.getClass()) return ip;
}
}
} catch (SocketException e) {
throw new RuntimeException(e);
}
return null;
Ответ 8
Вот мой подход к получению IP-адреса.
- Получить свой адрес шлюза по умолчанию
- Получить весь адрес на вашем ПК.
- Теперь в вашем IP-адресе (предположим, 192.168.100.4) и IP-адрес шлюза по умолчанию (предположим, 192.168.100.1) первые 9 цифр адреса должны быть одинаковыми, поэтому любой IP-адрес, который заполняет этот критерий, является вашим IP-адресом.
Пожалуйста, см. ниже полный рабочий код.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class MyIpAddress {
public static void main(String[] args) {
// doPortForwarding();
MyIpAddress myIpAddress = new MyIpAddress();
// get default address
String yourIp = myIpAddress.getYourIp(myIpAddress
.getDefaultGateWayAddress());
System.out.println(yourIp);
// get
} // amin
// return ip address for which u need to do port forwarding
private String getYourIp(String defaultAddress) {
String temp = defaultAddress.substring(0, 11);
String ipToForward = "";
TreeSet<String> ipAddrs = getIpAddressList();
for (Iterator<String> iterator = ipAddrs.iterator(); iterator.hasNext();) {
String tempIp = iterator.next();
if (tempIp.contains(temp)) {
ipToForward = tempIp;
break;
}
}
return ipToForward;
}// ipForPortForwarding
// get the ipaddress list
private TreeSet<String> getIpAddressList() {
TreeSet<String> ipAddrs = new TreeSet<String>();
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface
.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
// filters out 127.0.0.1 and inactive interfaces
if (iface.isLoopback() || !iface.isUp())
continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
ipAddrs.add(addr.getHostAddress());
}// 2 nd while
}// 1 st while
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ipAddrs;
}// getIpAddressList
// get default gateway address in java
private String getDefaultGateWayAddress() {
String defaultAddress = "";
try {
Process result = Runtime.getRuntime().exec("netstat -rn");
BufferedReader output = new BufferedReader(new InputStreamReader(
result.getInputStream()));
String line = output.readLine();
while (line != null) {
if (line.contains("0.0.0.0")) {
StringTokenizer stringTokenizer = new StringTokenizer(line);
stringTokenizer.nextElement();// first string is 0.0.0.0
stringTokenizer.nextElement();// second string is 0.0.0.0
defaultAddress = (String) stringTokenizer.nextElement(); // this is our default address
break;
}
line = output.readLine();
}// while
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return defaultAddress;
}// getDefaultAddress
}