[ACCEPTED]-How to get the ip of the computer on linux through Java?-ip-address
Do not forget about loopback addresses, which 3 are not visible outside. Here is a function 2 which extracts the first non-loopback IP(IPv4 1 or IPv6)
private static InetAddress getFirstNonLoopbackAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException {
Enumeration en = NetworkInterface.getNetworkInterfaces();
while (en.hasMoreElements()) {
NetworkInterface i = (NetworkInterface) en.nextElement();
for (Enumeration en2 = i.getInetAddresses(); en2.hasMoreElements();) {
InetAddress addr = (InetAddress) en2.nextElement();
if (!addr.isLoopbackAddress()) {
if (addr instanceof Inet4Address) {
if (preferIPv6) {
continue;
}
return addr;
}
if (addr instanceof Inet6Address) {
if (preferIpv4) {
continue;
}
return addr;
}
}
}
}
return null;
}
From Java Tutorial
Why is InetAddress
not a good solution? I don't 5 see anything in the docs about cross platform 4 compatibility?
This code will enumerate all 3 network interfaces and retrieve their information.
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;
public class ListNets
{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}
static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}
}
The 2 following is sample output from the example 1 program:
Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59
Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
This code worked 4me:
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class ShowIp {
public static void main(String[] args) throws SocketException {
NetworkInterface ni = NetworkInterface.getByName("eth0");
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress()) {
System.out.println("IP: " + ia.getHostAddress());
}
}
}
}
0
It's not ok to just return the first non-loopback 3 interface as it might have been created 2 by some software like Parallels. It's a 1 better bet to try fishing for the eth0.
static private InetAddress getIPv4InetAddress() throws SocketException, UnknownHostException {
String os = System.getProperty("os.name").toLowerCase();
if(os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) {
NetworkInterface ni = NetworkInterface.getByName("eth0");
Enumeration<InetAddress> ias = ni.getInetAddresses();
InetAddress iaddress;
do {
iaddress = ias.nextElement();
} while(!(iaddress instanceof Inet4Address));
return iaddress;
}
return InetAddress.getLocalHost(); // for Windows and OS X it should work well
}
The simplest solution in my case was Socket.getLocalAddress()
. I 4 had to open the Socket specifically for 3 that purpose, but with all the NetworkInterfaces 2 on my Ubuntu 10.04 machine it was the only 1 way to get the external IP address.
The best solution i've found is to run command 3 on linux / ubuntu machine.
So I run this 2 command hostname -I | cut -d' ' -f1
using java.
note - second part of 1 method is just to collect the output.
public String getIP() throws IOException
{
ProcessBuilder pb = new ProcessBuilder("bash", "-c", "hostname -I | cut -d' ' -f1");
Process process = pb.start();
InputStream inputStream = process.getInputStream();
Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8);
StringBuilder outputString = new StringBuilder();
while (scanner.hasNextLine())
{
synchronized (this)
{
String message = scanner.nextLine();
outputString.append(message);
outputString.append("\n");
log(message);
}
}
scanner.close();
return outputString.toString().trim();
}
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.