Wie, um Festzustellen, Internet-Netzwerk-Interface in Java
Wie bestimmen Sie die Netzwerkschnittstelle mit dem internet verbunden ist, die mit Java? Zum Beispiel, ich Lauf
InetAddress.getLocalHost().getHostAddress();
und innerhalb von Eclipse dieser liefert genau das, was ich beabsichtige, 192.168.1.105. Allerdings, wenn ich dieses Paket in einer jar-Datei und führen Sie das Programm, den code gibt 169.254.234.50. In diesen suchen, fand ich dies ist die IP-Adresse eines VMware Virtual Ethernet Adapter-Schnittstelle auf meinem Rechner.
Gibt es eine Möglichkeit, um zu bestimmen, die Schnittstelle mit dem internet verbunden, aber zur gleichen Zeit zu halten Portabilität für meinen code?
Vergleich von Schnittstellen
- Schnittstelle [net4]
display name : Intel(R) Centrino(R) Ultimate-N 6300 AGN
MTU : 1500
loopback : false
point to point: false
up : true
virtual : false
multicast : true
HW address : 00 24 D7 2C 5F 70
INET address (IPv4): 192.168.1.105
host name : MyComputer
canonical host name : MyComputer
loopback : false
site local : true
any local : false
link local : false
multicast : false
reachable : true
- Schnittstelle [eth5]
display name : VMware Virtual Ethernet Adapter for VMnet1
MTU : 1500
loopback : false
point to point: false
up : true
virtual : false
multicast : true
HW address : 00 50 56 C0 00 01
INET address (IPv4): 169.254.234.50
host name : MyComputer
canonical host name : MyComputer
loopback : false
site local : false
any local : false
link local : true
multicast : false
reachable : true
Gibt es eine Dritte VMware-Schnittstelle mit site local=true und link-local=false, so dass die Felder nicht helfen.
Nein, das ist auf einem Windows 7-Maschine. Ich habe VMWare installiert aber, und ich glaube, dies ist die Schnittstelle, die es verwendet für die Kommunikation mit der VM. Ich bin mir nicht sicher, warum Java wählt diese Schnittstelle als Standard. Dieses Verhalten ist identisch auf meine Mitbewohner computer (Windows 7, VMWare installiert)
Bitte siehe meine aktualisierte Antwort. Der code, den ich gepostet habe, nur druckt mein reales Netzwerk-interface, während ich habe Virtual Box das Netzwerk installiert und aktiviert ist.
InformationsquelleAutor Cavyn VonDeylen | 2011-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf meinem laptop (unter Windows 7 mit Virtual Box und Netzwerk-Schnittstelle installiert ist) der folgende code druckt den Namen meines wireless-Schnittstelle zusammen mit meiner lokalen Adresse. Es verwendet eine brute-force-Ansatz am Ende des Tages, sondern nur versuchen, tatsächlich eine Verbindung zu Adressen, die als die besten Kandidaten.
(habe ich aktualisiert meine Antwort mit
isReachable(...)
basierend auf Mocker, Tim s Antwort.)Einer Sache zu beachten.
socket.bind(...)
würde bellen mich an, dass die Adresse und der port ist bereits in Verwendung wenn ich versuchte, meinen code zu schnell in der Abfolge, wie die Verbindung ist nicht aufgeräumt schnell genug.8080
sollte sich für einen zufälligen port, vielleicht.Wenn Sie können, beschreiben Sie Ihren Anwendungsfall, wir könnten vorschlagen, Art der Lösung. Jedoch, es gibt keine clean Weg, dies zu tun. Meine erste Vermutung ist, dass Sie sollten filter, die durch Ihre IP-Adressen: throw-away Adressen nicht, beginnend mit
192.168.1
. Ja, es ist barbarisch.Danke! Dieser code funktioniert für mich. Ich bin überrascht, dass Java nicht bieten einige einfache Weg, dies zu tun, als würde ich denken, dies wäre ein Recht häufiges Problem. Vielleicht in Java 8.
in Java 8. Naja, ich bezweifle das. Ich bin zwar kein Netzwerkexperte, soweit ich weiß, kann man nicht von einer Netzwerk-Schnittstelle, die standardmäßig auf OS-Ebene. Nur es gibt Anwendungen, die können mit etwas - Schnittstelle als Standard. Grundsätzlich, wenn Sie verwenden Sie den code oben, wird genau das tun: basiert auf eine Annahme wird über eine Schnittstelle, die als Standard. Wie auch immer, ich habe noch eine Sache die zu beachten sind: vielleicht die
isReachable(...)
Teil im code ist überflüssig, weil die Schnittstellen, an diesem Punkt sind und Ihre Adressen sind local, also wahrscheinlich können Sie diesen Schritt überspringen.InformationsquelleAutor Kohányi Róbert
Werfen Sie einen Blick auf Abrufen Von Netzwerk-Schnittstellen und Liste Der Netzwerk-Interface-Adressen in der Java-Tutorial.
Wenn Sie mehrere Netzwerkschnittstellen haben, die in Betrieb sind, müssen Sie programmgesteuert das Netzwerk-interface, das Ihr Programm verwenden soll.
UPDATE:
Fand ich die Frage, die ähnlich ist zu verkaufen.
Siehe Antwort zu how-to-check-if-internet-Verbindung-ist-heute-in-java.
UPDATE 2:
IMHO sollten Sie das folgende in Ihrem Programm:
Siehe mein update.
InformationsquelleAutor MockerTim
Ich hatte das gleiche problem, und kam mit dieser Lösung (nicht so gründlich wie die Antwort, aber ich brauchte etwas, das nicht versucht, sich mit dem internet zu verbinden.
Basierend auf bekannten OUI für mac-Adressen: http://standards-oui.ieee.org/oui.txt
Machte ich einen quick-check (könnte optimiert mit binäre Logik)
InformationsquelleAutor mateuscb
War ich geplagt von dem gleichen problem für ein einiges und auch wenn die erste Frage wurde vor Ewigkeiten werde ich Anhängen, mein nehmen auf diesem Problem sowieso.
Die ironische Sache ist, dass war die Antwort zusammen mit der Frage.
Es ist:
siteLocal = true
Hier ist was für mich gearbeitet
Erhalten alle Netzwerk-Schnittstellen
Jene hervorzuheben, dass derzeit down (reduziert die Anzahl der Läufe)
Holen Sie sich die InetAddresses der Schnittstellen, die Sie nur herausgegriffen
Überprüfen Sie diese Adressen, wenn Sie sind site-local-Adressen
Das sollte Ihnen ein/alle InetAddress(es) - und die Netzwerk-Schnittstelle(N) ist/sind im Zusammenhang mit Ihrem lokalen Netzwerk.
Site-local definiert ist, zu verwenden Adressen aus dieser Netzwerke: 10.0.0.0, 172.16.0.0, 192.168.0.0, während VirtualBox-Adapter und andere in der Regel verwenden Sie die 169.254.0.0 link-local-Adressen.
IPv6 implementiert auch die site-local-Konzept, so ist es am besten, sich auf IPv4 hier.
Auf einen regulären end-user-Maschine sollte diese Arbeit ziemlich gut und zurück nur das eine physikalische Schnittstelle.
InformationsquelleAutor Pauliman