Πληροφορίες Διεπιφάνειας Δικτύου σε Java

Η διεπιφάνεια δικτύου (network interface) είναι το σημείο διασύνδεσης του υπολογιστή με το δίκτυο. Από φυσική άποψη, η διεπιφάνεια δικτύου ταυτίζεται με τη κάρτα διεπιφάνειας δικτύου (network interface card - NIC). Από προγραμματιστική άποψη, η διεπιφάνεια δικτύου αναφέρεται σε κλήσεις συστήματος που διαχειρίζονται τη κάρτα δικτύου. Για παράδειγμα, η διεπιφάνεια τοπικού βρόχου (localhost ή loopback, 127.0.0.1) που χρησιμοποιείται για έλεγχο δικτυακών εφαρμογών, είναι μια αφαίρεση λογισμικού.

Ακολουθούν μερικά παραδείγματα χρήσης της κλάσης NetworkInterface.

Γενικές πληροφορίες

Η κλάση NetworkInterface δεν έχει δημόσιο κατασκευαστή, επομένως δε μπορούμε να δημιουργήσουμε αντικείμενο με χρήση της new. Οι διεπιφάνειες δικτύου έχουν οριστεί από το λειτουργικό σύστημα και εμείς χρησιμοποιούμε στατικές μεθόδους για να πάρουμε πληροφορίες για τις διεπιφάνειες αυτές. Οι πιο συνηθισμένες είναι οι: getByInetAddress(), getByName(), και getNetworkInterfaces(). Οι δύο πρώτες μέθοδοι χρησιμοποιούνται όταν γνωρίζουμε ήδη το όνομα ή το IP της διεπιφάνειας (δες πχ /etc/hosts). Η τρίτη μέθοδος, getNetworkInterfaces() επιστρέφει τη λίστα όλων των διεπιφανειών του συστήματος.

Οι διεπιφάνειες δικτύου μπορεί να είναι οργανωμένες ιεραρχικά. Η κλάση NetworkInterface περιέχει δύο μεθόδους τη getParent() και τη getSubInterfaces() που αναφέρονται σε αυτή την ιεραρχία. Σε περίπτωση ανυπαρξίας γονέα ή παιδιού η κλήση της αντίστοιχης μεθόδου επιστρέφει null.

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNIFs
{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();

for (NetworkInterface netIf : Collections.list(nets)) {
out.printf("Display name: %s\n", netIf.getDisplayName());
out.printf("Name: %s\n", netIf.getName());
displaySubInterfaces(netIf);
out.printf("\n");
}
}

static void displaySubInterfaces(NetworkInterface netIf) throws SocketException {
Enumeration<NetworkInterface> subIfs = netIf.getSubInterfaces();

for (NetworkInterface subIf : Collections.list(subIfs)) {
out.printf("\tSub Interface Display name: %s\n", subIf.getDisplayName());
out.printf("\tSub Interface Name: %s\n", subIf.getName());
}
}
}
Eνδεικτικό αποτέλεσμα εκτέλεσης:
Display name: bge0
Name: bge0
Sub Interface Display name: bge0:3
Sub Interface Name: bge0:3
Sub Interface Display name: bge0:2
Sub Interface Name: bge0:2
Sub Interface Display name: bge0:1
Sub Interface Name: bge0:1

Display name: lo0

Εμφάνιση Διευθύνσεων

Για κάθε αντικείμενο της NetworkInterface που έχει οριστεί στο σύστημά μας, μπορούμε να βρούμε την IPv4 και IPv6 διεύθνσή του με δύο μεθόδους. Η μέθοδος getInetAddresses() επιστρέφει ένα Enumeration από InetAddress. Η μέθοδος getInterfaceAddresses() επιστρέφει μια λίστα από αντικείμενα java.net.InterfaceAddress. Αυτή η μέθοδος χρησιμοποιείται όταν χρειαζόμαστε περισσότερες πληροφορίες.
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

Εμφάνιση Παραμέτρων

Μπορούμε να ελέγξουμε διάφορες παραμέτρους της διεπαφής δικτύου (δες ifconfig) οπως:
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNetsEx
{
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("Up? %s\n", netint.isUp());
out.printf("Loopback? %s\n", netint.isLoopback());
out.printf("PointToPoint? %s\n", netint.isPointToPoint());
out.printf("Supports multicast? %s\n", netint.supportsMulticast());
out.printf("Virtual? %s\n", netint.isVirtual());
out.printf("Hardware address: %s\n",
Arrays.toString(netint.getHardwareAddress()));
out.printf("MTU: %s\n", netint.getMTU());

out.printf("\n");

}
}
Ενεδικτικό αποτέλεσμα εκτέλεσης:
Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /129.156.225.59
Up? true
Loopback? false
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: [0, 3, 4, 5, 6, 7]
MTU: 1500

Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
Up? true
Loopback? true
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: null
MTU: 8232

InetAddress: /127.0.0.1
Name: lo0