Как я могу получить IP-адрес LAN использующего компьютеры Java? Я хочу IP-адрес, который подключен к маршрутизатору и остальной части сети.
Я попробовал что-то вроде этого:
Socket s = new Socket("www.google.com", 80);
String ip = s.getLocalAddress().getHostAddress();
s.close();
Это, кажется, работает над некоторыми случаями, но иногда это возвращает адресное обратной петлей или что-то совершенно другое. Кроме того, это требует интернет-соединения.
Кто-либо получил более точный метод выполнения этого?
Править: Мысль было бы лучше спросить здесь, чем в комментарии..
Что, если Вы получили много интерфейсов? Например, один для кабеля, один для Wi-Fi и один для виртуального поля или около этого. Действительно ли невозможно на самом деле видеть, какой подключен к сети?
Попробуйте java.net.NetworkInterface
import java.net.NetworkInterface;
...
for (
final Enumeration< NetworkInterface > interfaces =
NetworkInterface.getNetworkInterfaces( );
interfaces.hasMoreElements( );
)
{
final NetworkInterface cur = interfaces.nextElement( );
if ( cur.isLoopback( ) )
{
continue;
}
System.out.println( "interface " + cur.getName( ) );
for ( final InterfaceAddress addr : cur.getInterfaceAddresses( ) )
{
final InetAddress inet_addr = addr.getAddress( );
if ( !( inet_addr instanceof Inet4Address ) )
{
continue;
}
System.out.println(
" address: " + inet_addr.getHostAddress( ) +
"/" + addr.getNetworkPrefixLength( )
);
System.out.println(
" broadcast address: " +
addr.getBroadcast( ).getHostAddress( )
);
}
}
Сначала: нет единого адреса. У вашего компьютера как минимум два адреса (127.0.0.1 на «lo» и, возможно, 192.168.1.1 на «eth1»).
Вам нужно следующее: Список сетевых интерфейсов
Как и следовало ожидать, вы не можете автоматически определить, какой из них подключен к любому из ваших маршрутизаторов, поскольку это требует потенциально сложного анализа ваших таблиц маршрутизации. Но если вам просто нужен какой-либо нелокальный адрес, этого должно быть достаточно. Конечно, попробуйте использовать это хотя бы один раз в Vista или Windows 7, поскольку они добавляют адреса IPv6.
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");
}
}
Ниже приводится пример вывода из примера программы:
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
try {
InetAddress addr = InetAddress.getLocalHost();
// Get IP Address
byte[] ipAddr = addr.getAddress();
// Get hostname
String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}
Это метод, который я использовал некоторое время. Он также включает небольшой прием, позволяющий определить внешний вид IP-адреса.
private List<String> getLocalHostAddresses() {
List<String> addresses = new ArrayList<String>();
try {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = e.nextElement();
Enumeration<InetAddress> e2 = ni.getInetAddresses();
while (e2.hasMoreElements())
addresses.add(e2.nextElement().getHostAddress());
}
URL u = new URL("http://whatismyip.org");
BufferedReader in = new BufferedReader(new InputStreamReader(
u.openStream()));
addresses.add(in.readLine());
in.close();
} catch (Exception ignore) {
}
return addresses;
}