Я пишу простое сетевое приложение... Мне нужно знать реальный ip моей машины в сети, например 192.168.1.3. getLocalHost возвращает 127.0.0.1 (на Linux, dunno, если это то же самое на windows), как это сделать?;
Java InetAddress.getLocalHost(); возвращает 127.0.0.1... как получить REAL IP?
Ответ 1
Если вы действительно хотите работать со всеми IP-адресами на компьютере, вы можете получить их с классом NetworkInterface. Конечно, тогда вам нужно, какой именно вы хотите использовать, но это будет отличаться в зависимости от того, для чего вы его используете, или вам может понадобиться расширить способ использования его для учета нескольких адресов.
import java.net.*;
import java.util.*;
public class ShowInterfaces
{
public static void main(String[] args) throws Exception
{
System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1"
Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
for (; n.hasMoreElements();)
{
NetworkInterface e = n.nextElement();
System.out.println("Interface: " + e.getName());
Enumeration<InetAddress> a = e.getInetAddresses();
for (; a.hasMoreElements();)
{
InetAddress addr = a.nextElement();
System.out.println(" " + addr.getHostAddress());
}
}
}
}
Ответ 2
Поскольку у устройства может быть несколько адресов, трудно определить, какой из них для вас. Как правило, вы хотите, чтобы система назначала IP-адрес на основе своей таблицы маршрутизации. Поскольку результат зависит от IP, к которому вы хотите подключиться, существует простой трюк: просто создайте соединение и посмотрите, какой адрес у вас есть в ОС:
// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());
Я не уверен, возможно ли это сделать, не установив соединение. Кажется, мне когда-то удалось это сделать с Perl (или C?), Но не спрашивайте меня о Java. Я думаю, что возможно создать UDP-сокет (DatagramSocket), фактически не связав его.
Если есть NAT-маршрутизатор по пути, вы не сможете получить IP-адрес, который будут видеть удаленные хосты. Однако, как вы дали 192. * в качестве примера, я думаю, вам все равно.
Ответ 3
Чтобы исправить это:
-
Найдите имя своего хоста. Тип:
hostname
. Например, вы обнаружите, что ваше имя хостаmycomputer.xzy.com
-
Поместите имя своего хоста в файл вашего хоста.
/etc/hosts
. Например,10.50.16.136 mycomputer.xzy.com
Ответ 4
Вот способ избежать результатов IPv6 и Loopback.
public InetAddress getCurrentIp() {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) networkInterfaces
.nextElement();
Enumeration<InetAddress> nias = ni.getInetAddresses();
while(nias.hasMoreElements()) {
InetAddress ia= (InetAddress) nias.nextElement();
if (!ia.isLinkLocalAddress()
&& !ia.isLoopbackAddress()
&& ia instanceof Inet4Address) {
return ia;
}
}
}
} catch (SocketException e) {
LOG.error("unable to get current IP " + e.getMessage(), e);
}
return null;
}
Ответ 5
На вашем компьютере может быть несколько IP-адресов. Откуда вы знаете, какой? То, как я это делаю, - это иметь очень простой CGI, работающий на другом компьютере, который сообщает о просмотре IP-адреса, и я ударил его, когда мне нужно знать, как выглядит мой IP-адрес для внешнего мира.
Ответ 6
Вместо использования InetAddress.getHostAddress() я вызываю процедуру getHost4Address, которую я написал, чтобы получить первый адрес без петли...
/**
* Returns this host non-loopback IPv4 addresses.
*
* @return
* @throws SocketException
*/
private static List<Inet4Address> getInet4Addresses() throws SocketException {
List<Inet4Address> ret = new ArrayList<Inet4Address>();
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets)) {
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
ret.add((Inet4Address)inetAddress);
}
}
}
return ret;
}
/**
* Returns this host first non-loopback IPv4 address string in textual
* representation.
*
* @return
* @throws SocketException
*/
private static String getHost4Address() throws SocketException {
List<Inet4Address> inet4 = getInet4Addresses();
return !inet4.isEmpty()
? inet4.get(0).getHostAddress()
: null;
}
Ответ 7
Я написал этот код:
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
private String[] getHostAddresses() {
Set<String> HostAddresses = new HashSet<>();
try {
for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) {
if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) {
for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
if (ia.getBroadcast() != null) { //If limited to IPV4
HostAddresses.add(ia.getAddress().getHostAddress());
}
}
}
}
} catch (SocketException e) { }
return HostAddresses.toArray(new String[0]);
}
Проверьте это!
Для меня:
- Должен быть не LoopBack!
- Должен быть UP!
- Должен иметь MAC-адрес (не равен нулю)
Ответ 8
Получить текущий запрос из текущего экземпляра
HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
затем получите адрес из запроса
ip = httpServletRequest.getRemoteAddr();
Ответ 9
Если вы хотите получить IP-адрес своего ПК, вы должны использовать объект InetAddress, который существует в библиотеке java.net.InetAddress.
Следующий метод возвращает ваш IP:
public String getIp() {
String myIp = "";
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
myIp = ip.getHostAddress(); // This method returns the IP.
} catch (UnknownHostException e) {
e.printStackTrace();
}
return myIp;
}