02 fevereiro 2009

A interface InterfaceAddress

Algo que não tinha sabido , até o momento, é dos recursos da nova interface InterfaceAddress (nova interface do jsdk 1.6). Através dela podemos obter uma lista de adaptadores de rede e suas respectivas informações, como por exemplo em um código como este:


import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Iterator;
import java.util.List;
import java.util.Enumeration;


public class NetworkInterfaces {
public static void main(String[] args) throws Exception {
NetworkParameter np = new NetworkParameter();

// obtem todas as interfaces de rede da máquina.
Enumeration en = NetworkInterface.getNetworkInterfaces();

// exibe informações
while (en.hasMoreElements()) {
NetworkInterface ni = en.nextElement();
np.printParameter(ni);
System.out.println("==================================");
}
}

}

class NetworkParameter {

public void printParameter(NetworkInterface ni) throws SocketException {

// Exibe todas as informações da interface de rede
System.out.println("Interface de rede:");
System.out.println("------------------");
System.out.println(" Nome = " + ni.getName());
System.out.println(" Nome de exibição = " + ni.getDisplayName());
System.out.println(" Está ativa = " + ni.isUp());
System.out.println(" Suporta multicast = " + ni.supportsMulticast());
System.out.println(" É local = " + ni.isLoopback());
System.out.println(" É virtual = " + ni.isVirtual());
System.out.println(" É ponto a ponto = " + ni.isPointToPoint());
System.out.println(" Endereço do hardware = " + ni.getHardwareAddress());
System.out.println(" MTU = " + ni.getMTU());

// Obtém uma lista de todas as interfaces de rede
System.out.println("\nLista de endereços da Interface:");
System.out.println("----------------------------");
List list = ni.getInterfaceAddresses();
Iterator it = list.iterator();

// iterar
while (it.hasNext()) {
InterfaceAddress ia = it.next();
System.out.println(" IP = " + ia.getAddress());
System.out.println(" Broadcast = " + ia.getBroadcast());
System.out.println(" Tamanho do prefixo da rede = " + ia.getNetworkPrefixLength());
System.out.println("");
}
}
}


Quando colocado em execução produz o resultado abaixo (aqui no meu notebook):

Interface de rede:
------------------
Nome = lo
Nome de exibição = MS TCP Loopback interface
Está ativa = true
Suporta multicast = true
É local = true
É virtual = false
É ponto a ponto = false
Endereço do hardware = null
MTU = 1520

Lista de endereços da Interface:
----------------------------
IP = /127.0.0.1
Broadcast = /127.255.255.255
Tamanho do prefixo da rede = 8

==================================
Interface de rede:
------------------
Nome = eth0
Nome de exibição = VIA Compatable Fast Ethernet Adapter - Miniporta do agendador de pacotes
Está ativa = true
Suporta multicast = true
É local = false
É virtual = false
É ponto a ponto = false
Endereço do hardware = [B@42e816
MTU = 1500

Lista de endereços da Interface:
----------------------------
IP = /192.168.254.2
Broadcast = /192.168.254.255
Tamanho do prefixo da rede = 24

==================================
Interface de rede:
------------------
Nome = eth1
Nome de exibição = RT73 USB Wireless LAN Card - Miniporta do agendador de pacotes
Está ativa = false
Suporta multicast = true
É local = false
É virtual = false
É ponto a ponto = false
Endereço do hardware = [B@9304b1
MTU = 1500

Lista de endereços da Interface:
----------------------------
==================================

2 comentários:

LindemBERG disse...

Olá Cleuber!!
Muito bom sua postagem...realmente era o que eu estava procurando.
Mas tipo assim, eu to querendo fazer uma aplicação para listar as duas interfaces de rede, ou seja, apenas a cabeada e a wireless. Nessa listagem de interfaces instaladas no minha aplicação, poderei exibir o ip das duas. Qual seria o criterio pra apresentar apenas os dois tipos de interfaces?? Isso excluindo outras que não é necessário como lo (loopback) e outros drivers virtuais e não ativos.
Agradeço desde já!
Um abraço!

Cleuber disse...

O método ni.getName(), obtém como retorno por exemplo eth0, eth1, ethX..., desta forma você pode filtrar pelo nome, e obter somente as interfaces do tipo ethernet e wireless.

Espero ter ajudado ;)