Heim  >  Artikel  >  Java  >  So testen Sie die Java-Netzwerkkonnektivität

So testen Sie die Java-Netzwerkkonnektivität

王林
王林nach vorne
2023-05-04 15:49:061230Durchsuche

Im Allgemeinen müssen wir nur feststellen, ob eine Maschine auf eine andere Maschine zugreifen (Ping) kann. Zu diesem Zeitpunkt können wir einfach die Klasse java.net.InetAddress in der Java-Klassenbibliothek verwenden, um dies zu erreichen Erkennen Sie, ob der Remote-Computer erreichbar ist

boolean isReachable(int timeout) // 测试地址是否可达 boolean isReachable(NetworkInterface netif, int ttl, int timeout)  // 测试地址是否可达.

Einfach ausgedrückt besteht die obige Methode darin, ein InetAddress-Objekt über die IP-Adresse des Remote-Computers zu erstellen und dann seine isReachable-Methode aufzurufen, um die Netzwerkerreichbarkeit des aufrufenden Computers und des Remote-Computers zu testen . Beachten Sie, dass der Remote-Computer möglicherweise über mehrere IP-Adressen verfügt. Daher möchten Sie möglicherweise alle Szenarios iterativ testen.

void isAddressAvailable(String ip){      try{        InetAddress address = InetAddress.getByName(ip);//ping this IP               if(address instanceof java.net.Inet4Address){           System.out.println(ip + " is ipv4 address");        }else         if(address instanceof java.net.Inet6Address){           System.out.println(ip + " is ipv6 address");        }else{           System.out.println(ip + " is unrecongized");        }               if(address.isReachable(5000)){            System.out.println("SUCCESS - ping " + IP + " with no interface specified");        }else{           System.out.println("FAILURE - ping " + IP + " with no interface specified");        }               System.out.println("\n-------Trying different interfaces--------\n");               Enumeration<NetworkInterface> netInterfaces =              NetworkInterface.getNetworkInterfaces();           while(netInterfaces.hasMoreElements()) {                NetworkInterface ni = netInterfaces.nextElement();                System.out.println( "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName());      if(address.isReachable(ni, 0, 5000)){            System.out.println("SUCCESS - ping " + ip);        }else{            System.out.println("FAILURE - ping " + ip);        }               Enumeration<InetAddress> ips = ni.getInetAddresses();           while(ips.hasMoreElements()) {               System.out.println("IP: " + ips.nextElement().getHostAddress());          }        System.out.println("-------------------------------------------");        }          }catch(Exception e){        System.out.println("error occurs.");        e.printStackTrace();          }         }

Programmausgabe:

--------------START--------------    10.13.20.70 is ipv4 address   SUCCESS - ping 10.13.20.70 with no interface specified    -------Trying different interfaces--------    Checking interface, DisplayName:MS TCP Loopback interface, Name:lo   FAILURE - ping 10.13.20.70   IP: 127.0.0.1   -------------------------------------------   Checking interface, DisplayName:Intel(R) Centrino(R) Advanced-N 6200 AGN -   Teefer2 Miniport, Name:eth0   FAILURE - ping 10.13.20.70   IP: 9.123.231.40   -------------------------------------------   Checking interface, DisplayName:Intel(R) 82577LM Gigabit Network Connection -   Teefer2 Miniport, Name:eth2   SUCCESS - ping 10.13.20.70   -------------------------------------------   Checking interface, DisplayName:WAN (PPP/SLIP) Interface, Name:ppp0   SUCCESS - ping 10.13.20.70   IP: 10.0.50.189   -------------------------------------------    --------------END--------------

Wie Sie oben sehen können, kann die Verwendung von isReachable verwendet werden, um die Erreichbarkeit des Remote-Netzwerks zu ermitteln, ohne eine Schnittstelle anzugeben. Dadurch kann jedoch nicht unterschieden werden, von welcher Netzwerkschnittstelle das Datenpaket gesendet wird (wenn mehrere lokale Netzwerkschnittstellen vorhanden sind); die erweiterte Version von isReachable kann angeben, von welcher lokalen Netzwerkschnittstelle aus getestet werden soll, sodass Sie genau wissen, mit welcher lokalen Netzwerkschnittstelle das Remote-Netzwerk eine Verbindung herstellen kann.

Java selbst bietet jedoch keine Methode, um zu bestimmen, welche lokale IP-Adresse eine Verbindung zum Remote-Netzwerk herstellen kann, und die Java-Netzwerkprogrammierschnittstelle bietet keine Methode für den Zugriff auf Datenpakete des ICMP-Protokolls, sodass dies über das nicht erreichbare ICMP-Netzwerk erreicht wird Dies ist auch nicht möglich (natürlich kann es mit JNI implementiert werden, aber es hängt von der Systemplattform ab). Zu diesem Zeitpunkt können Sie die im nächsten Abschnitt dieses Artikels vorgeschlagene Methode in Betracht ziehen.

In einigen Fällen möchten wir möglicherweise bestimmen, welche lokale Netzwerkadresse eine Verbindung zum Remote-Netzwerk herstellen kann, damit das Remote-Netzwerk wieder eine Verbindung zum lokalen Netzwerk herstellen kann, um bestimmte Dienste zu nutzen oder bestimmte Benachrichtigungen auszugeben. Ein typisches Anwendungsszenario besteht darin, dass ein Dateiübertragungsdienst (z. B. FTP) lokal gestartet wird und eine lokale IP-Adresse an den Remote-Computer gesendet werden muss, damit der Remote-Computer Dateien über diese Adresse herunterladen kann Der Dienst benachrichtigt die registrierte Maschine, um diese Ereignisse zu erhalten, wenn bestimmte Ereignisse auftreten (häufig im Bereich der Systemverwaltung). Daher muss bei der Registrierung eine lokal erreichbare Adresse (von der Fernbedienung) angegeben werden.

Obwohl wir die InetAddress.isReachabl-Methode verwenden können, um zu bestimmen, welche lokale Netzwerkschnittstelle mit Remote Play verbunden werden kann, ist sie hier nicht geeignet, da eine einzelne Netzwerkschnittstelle mit mehreren IP-Adressen konfiguriert werden kann. Wir können Socket verwenden, um eine mögliche TCP-Verbindung herzustellen und dann festzustellen, ob eine lokale IP-Adresse für das Remote-Netzwerk erreichbar ist. Wir verwenden die Connect-Methode in der Klasse java.net.Socket

void connect(SocketAddress endpoint, int timeout)  //使用Socket连接服务器,指定超时的时间

Diese Methode erfordert einen Remote-Port, bei dem es sich um einen beliebigen offenen Service-Port basierend auf dem TCP-Protokoll handeln kann (z. B. den allgemein offenen ECHO-Service-Port 7, den Linux-SSH-Service-Port). 22 usw.). Tatsächlich wird die hergestellte TCP-Verbindung vom Protokollstapel in die Verbindungswarteschlange gestellt und dann an verschiedene Anwendungsdienste verteilt, die die Daten tatsächlich verarbeiten. Da UDP keinen Verbindungsprozess hat, ist dies bei UDP-basierten Diensten (z. B. SNMP) nicht möglich in dieser Methode angewendet.

Der spezifische Prozess besteht darin, jede lokale Netzwerkadresse aufzulisten, einen lokalen Socket einzurichten und zu versuchen, eine Verbindung zur Remote-Adresse an einem bestimmten Port herzustellen. Wenn eine Verbindung hergestellt werden kann, bedeutet dies, dass die lokale Adresse das Remote-Netzwerk erreichen kann.

void printReachableIP(InetAddress remoteAddr, int port){      String retIP = null;           Enumeration<NetworkInterface> netInterfaces;      try{        netInterfaces = NetworkInterface.getNetworkInterfaces();        while(netInterfaces.hasMoreElements()) {               NetworkInterface ni = netInterfaces.nextElement();               Enumeration<InetAddress> localAddrs = ni.getInetAddresses();            while(localAddrs.hasMoreElements()){                InetAddress localAddr = localAddrs.nextElement();                if(isReachable(localAddr, remoteAddr, port, 5000)){                        retIP = localAddr.getHostAddress();                        break;               }        }          }      } catch(SocketException e) {          System.out.println(     "Error occurred while listing all the local network addresses.");      }         if(retIP == null){          System.out.println("NULL reachable local IP is found!");      }else{          System.out.println("Reachable local IP is found, it is " + retIP);      }          }         boolean isReachable(InetAddress localInetAddr, InetAddress remoteInetAddr,                     int port, int timeout) {       booleanisReachable = false;      Socket socket = null;      try{          socket = newSocket();          // 端口号设置为 0 表示在本地挑选一个可用端口进行连接         SocketAddress localSocketAddr = new InetSocketAddress(localInetAddr, 0);          socket.bind(localSocketAddr);          InetSocketAddress endpointSocketAddr =          new InetSocketAddress(remoteInetAddr, port);          socket.connect(endpointSocketAddr, timeout);                 System.out.println("SUCCESS - connection established! Local: " +            localInetAddr.getHostAddress() + " remote: " +            remoteInetAddr.getHostAddress() + " port" + port);          isReachable = true;      } catch(IOException e) {          System.out.println("FAILRE - CAN not connect! Local: " +        localInetAddr.getHostAddress() + " remote: " +        remoteInetAddr.getHostAddress() + " port" + port);      } finally{          if(socket != null) {          try{          socket.close();          } catch(IOException e) {             System.out.println("Error occurred while closing socket..");            }          }      }      return isReachable;   }

Laufende Ergebnisse

--------------START--------------    FAILRE - CAN not connect! Local: 127.0.0.1 remote: 10.8.1.50 port22   FAILRE - CAN not connect! Local: 9.123.231.40 remote: 10.8.1.50 port22   SUCCESS - connection established! Local: 10.0.50.189 remote: 10.8.1.50 port22   Reachable local IP is found, it is 10.0.50.189   --------------END--------------

Wenn in der Netzwerkumgebung IPv4 und IPv6 vorhanden sind, das heißt, wenn die Maschine sowohl eine IPv4-Adresse als auch eine IPv6-Adresse hat, können wir einige Optimierungen am Programm vornehmen, wie z Da die Unterschiede zwischen IPv4- und IPv6-Adressen nicht aufeinander zugreifen können, muss nur die Erreichbarkeit zwischen IPv4- und IPv6-Adressen ermittelt werden.

  • Sie müssen kein Urteil über die IPv4-Rücksprungadresse fällen, und Sie können den Test für die IPv6-Linklocal-Adresse überspringen

  • Je nach tatsächlichem Bedarf können wir der Verwendung von IPv4 oder IPv6 zur Verbesserung Vorrang einräumen die Effizienz der Beurteilung

  • Bestimmen Sie, ob die lokale Adresse und die Remote-Adresse beide IPv4 oder IPv6 sind

    // 判断是 IPv4 还是 IPv6   if(!((localInetAddr instanceofInet4Address) && (remoteInetAddr instanceofInet4Address)   || (localInetAddr instanceofInet6Address) && (remoteInetAddr instanceofInet6Address))){   // 本地和远程不是同时是 IPv4 或者 IPv6,跳过这种情况,不作检测  break;   }
  • Überspringen Sie die lokale Adresse und verknüpfen Sie die lokale Adresse
if( localAddr.isLoopbackAddress() ||       localAddr.isAnyLocalAddress() ||       localAddr.isLinkLocalAddress() ){       // 地址为本地环回地址,跳过      break;   }

Das obige ist der detaillierte Inhalt vonSo testen Sie die Java-Netzwerkkonnektivität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen