일반적으로 한 시스템이 다른 시스템에 액세스(Ping)할 수 있는지 여부만 확인하면 됩니다. 이 클래스는 이를 달성하기 위해 Java 클래스 라이브러리의 java.net.InetAddress 클래스를 사용하면 됩니다. 원격 시스템에 연결할 수 있는지 감지
boolean isReachable(int timeout) // 测试地址是否可达 boolean isReachable(NetworkInterface netif, int ttl, int timeout) // 测试地址是否可达.
간단히 말하면 위 방법은 원격 시스템의 IP 주소를 통해 InetAddress 개체를 구성한 다음 isReachable 메서드를 호출하여 호출 시스템과 원격 시스템의 네트워크 연결 가능성을 테스트하는 것입니다. . 원격 시스템에는 여러 IP 주소가 있을 수 있으므로 모든 시나리오를 반복적으로 테스트할 수 있습니다.
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(); } }
프로그램 출력:
--------------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--------------
위에서 볼 수 있듯이 isReachable을 사용하면 인터페이스를 지정하지 않고도 원격 네트워크의 연결 가능성을 확인할 수 있지만, 이는 데이터 패킷이 어느 네트워크 인터페이스에서 전송되는지 구별할 수 없습니다. (로컬 네트워크 인터페이스가 여러 개인 경우) isReachable의 고급 버전은 테스트할 로컬 네트워크 인터페이스를 지정할 수 있으므로 원격 네트워크가 연결할 수 있는 로컬 네트워크 인터페이스를 정확하게 알 수 있습니다.
그러나 Java 자체는 원격 네트워크에 연결할 수 있는 로컬 IP 주소를 결정하는 방법을 제공하지 않으며 Java 네트워크 프로그래밍 인터페이스는 ICMP 프로토콜 데이터 패킷에 액세스하는 방법을 제공하지 않으므로 이는 ICMP 네트워크 연결 불가를 통해 달성됩니다. 또한 불가능합니다(물론 JNI를 사용하여 구현할 수 있지만 시스템 플랫폼에 따라 다릅니다). 이때 이 기사의 다음 섹션에서 제안하는 방법을 고려해 볼 수 있습니다.
어떤 경우에는 원격 네트워크에 연결할 수 있는 로컬 네트워크 주소를 결정하여 원격 네트워크가 로컬에 다시 연결하여 특정 서비스를 사용하거나 특정 알림을 보낼 수 있도록 할 수 있습니다. 일반적인 응용 시나리오는 파일 전송 서비스(예: FTP)가 로컬에서 시작되고 원격 시스템이 이 주소를 통해 파일을 다운로드할 수 있도록 로컬 IP 주소를 원격 시스템으로 보내야 하거나 원격 시스템이 특정 기능을 제공하는 것입니다. 서비스는 특정 이벤트가 발생할 때 이러한 이벤트를 가져오도록 등록된 시스템에 알리므로(시스템 관리 분야에서 일반적임) 등록 시 원격에서 연결할 수 있는 로컬 주소를 제공해야 합니다.
InetAddress.isReachabl 메서드를 사용하여 원격 플레이에 연결할 수 있는 로컬 네트워크 인터페이스를 결정할 수 있지만 단일 네트워크 인터페이스가 여러 IP 주소로 구성될 수 있으므로 여기에는 적합하지 않습니다. Socket을 사용하여 가능한 TCP 연결을 설정한 다음 로컬 IP 주소가 원격 네트워크에 도달할 수 있는지 여부를 확인할 수 있습니다. 우리는 java.net.Socket 클래스의 연결 메소드를 사용합니다
void connect(SocketAddress endpoint, int timeout) //使用Socket连接服务器,指定超时的时间
이 메소드에는 원격 포트가 필요합니다. 이는 TCP 프로토콜을 기반으로 하는 개방형 서비스 포트(예: 일반적으로 개방형 ECHO 서비스 포트 7, Linux SSH 서비스 포트)일 수 있습니다. 22 등). 실제로 설정된 TCP 연결은 프로토콜 스택에 의해 연결 큐에 배치된 후 실제로 데이터를 처리하는 다양한 응용 서비스에 배포됩니다. UDP에는 연결 프로세스가 없으므로 UDP 기반 서비스(예: SNMP)는 불가능합니다. 이 방법으로 적용됩니다.
구체적인 프로세스는 각 로컬 네트워크 주소를 열거하고 로컬 소켓을 설정한 후 특정 포트에서 원격 주소에 연결을 시도하는 것입니다. 연결이 가능하다면 로컬 주소가 원격 네트워크에 도달할 수 있다는 의미입니다.
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; }
실행 결과
--------------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--------------
네트워크 환경에 IPv4와 IPv6가 있는 경우, 즉 머신에 IPv4 주소와 IPv6 주소가 모두 있는 경우 다음과 같은 프로그램 최적화를 수행할 수 있습니다.
IPv4와 IPv6 주소 간의 차이는 서로 액세스할 수 없으므로 IPv4 주소와 IPv6 주소 간의 연결 가능성만 결정하면 됩니다.
IPv4 반환 주소에 대해서는 판단할 필요가 없으며 IPv6 링크 로컬 주소에 대한 테스트는 건너뛰어도 됩니다.
실제 필요에 따라 IPv4 또는 IPv6 사용을 우선적으로 사용하여 개선할 수 있습니다. 판단의 효율성
로컬 주소와 원격 주소가 모두 IPv4인지 IPv6인지 확인
// 判断是 IPv4 还是 IPv6 if(!((localInetAddr instanceofInet4Address) && (remoteInetAddr instanceofInet4Address) || (localInetAddr instanceofInet6Address) && (remoteInetAddr instanceofInet6Address))){ // 本地和远程不是同时是 IPv4 或者 IPv6,跳过这种情况,不作检测 break; }
로컬 주소와 LinkLocal 주소 건너뛰기
if( localAddr.isLoopbackAddress() || localAddr.isAnyLocalAddress() || localAddr.isLinkLocalAddress() ){ // 地址为本地环回地址,跳过 break; }
위 내용은 Java 네트워크 연결을 테스트하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!