>  기사  >  Java  >  웹사이트 주소를 기반으로 DNS/IP 주소를 쿼리하는 Java 방법

웹사이트 주소를 기반으로 DNS/IP 주소를 쿼리하는 Java 방법

小云云
小云云원래의
2017-12-06 10:21:182065검색

요구 사항: URL 주소(예: http://www.cncounter.com/tools/shorturl.php)가 주어지면 해당 IP 주소와 포트 번호를 구문 분석하세요.

참고: 이 문서에서는 기본 DNS 프로토콜을 다루지 않으며 Java 플랫폼에서 제공하는 API를 직접 사용하여 작동합니다.

DNS는 도메인 이름 서비스인 Domain Name Service입니다.

우리는 Java의 URL 관련 클래스에 java.net.URL 및 java.net.URI 등이 포함되어 있다는 것을 알고 있습니다. 여기서 URI는 file:과 같은 프로토콜을 포함할 수 있는 리소스 로케이터입니다.

여기서는 URL 클래스를 사용합니다. 포트 번호를 가져오는 코드는 다음과 같습니다.

 /**
   * 获取端口号
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static int parsePort(String href) throws IOException {
    //
    URL url = new URL(href);
    // 端口号; 如果 href 中没有明确指定则为 -1
    int port = url.getPort();
    if (port < 0) {
      // 获取对应协议的默认端口号
      port = url.getDefaultPort();
    }
    return port;
  }

URL 클래스는 Java 초기에 존재했던 클래스입니다. 내부 로직은 비교적 복잡합니다. 관심이 있는 경우 관련 JDK 구현 코드를 직접 볼 수 있습니다.

포트 번호를 가져오는 방법에는 두 가지가 있습니다.

getPort()는 URL에 지정된 포트 번호를 가져오는 것입니다. 지정하지 않으면 -1이 반환됩니다.

getDefaultPort()는 프로토콜에 해당하는 기본 포트 번호를 가져오는 것입니다(예: http 프로토콜의 기본 포트 번호는 80, https 프로토콜의 기본 포트 번호는 443 등).

그럼 Host 부분을 추출하는 코드를 살펴보겠습니다.

 /**
   * 获取Host部分
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static String parseHost(String href) throws IOException {
    //
    URL url = new URL(href);
    // 获取 host 部分
    String host = url.getHost();
    return host;
  }

기본적으로 정규식이나 문자열을 통해서도 Host를 직접 가로챌 수도 있지만, 복잡한 상황에 직면하면 처리하기가 쉽지 않습니다. 예: https:/ /yourname:passwd@gitee.com/mumu-osc/NiceFish.git와 같은 복잡한 URL.

도메인 이름을 추출한 후 java.net.InetAddress 클래스를 사용하여 IP 주소를 찾을 수 있습니다.

코드는 다음과 같습니다.

 /**
   * 根据域名(host)解析IP地址
   *
   * @param host 域名
   * @return
   * @throws IOException
   */
  public static String parseIp(String host) throws IOException {
    // 根据域名查找IP地址
    InetAddress inetAddress = InetAddress.getByName(host);
    // IP 地址
    String address = inetAddress.getHostAddress();
    return address;
  }

보시다시피 InetAddress.getByName() 정적 메소드를 사용하여 IP를 찾았습니다.

이 클래스는 다른 정적 메소드도 제공하지만 일반적으로 많이 사용되지는 않습니다. 관심이 있으시면 오픈 소스 코드를 클릭하여 살펴보실 수 있습니다.

이후 main() 메소드를 통해 간단한 테스트를 진행합니다.

 public static void main(String[] args) throws IOException {
    //
    String href = "http://www.cncounter.com/tools/shorturl.php";
    // 端口号
    int port = parsePort(href);
    // 域名
    String host = parseHost(href);
    // IP 地址
    String address = parseIp(host);
  //
    System.out.println("host=" + host); 
    System.out.println("port=" + port); 
    System.out.println("address=" + address); 
  }

실행 결과는 다음과 같습니다.

host=www.cncounter.com
port=80
address=198.11.179.83

IP와 포트 번호를 알면 Socket을 통해 직접 연결할 수 있습니다.

물론 http 프로토콜이라면 강력하고 사용하기 쉬운 Apache의 HttpClient 도구를 사용할 수 있습니다. 하지만 이 라이브러리의 단점은 다양한 버전이 서로 호환되지 않고 프로그래밍 시 API가 자주 변경된다는 점입니다. 특정 버전 번호에 따라 처리해야 합니다.

완전한 코드는 다음과 같습니다.

import java.io.IOException;
import java.net.*;
/**
 * 查找IP地址
 */
public class TestFindDNS {
  public static void main(String[] args) throws IOException {
    //
    String href = "http://www.cncounter.com/tools/shorturl.php";
    // 端口号
    int port = parsePort(href);
    // 域名
    String host = parseHost(href);
    // IP 地址
    String address = parseIp(host);
    //
    System.out.println("host=" + host);
    System.out.println("port=" + port);
    System.out.println("address=" + address);
  }
  /**
   * 获取端口号
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static int parsePort(String href) throws IOException {
    //
    URL url = new URL(href);
    // 端口号; 如果 href 中没有明确指定则为 -1
    int port = url.getPort();
    if (port < 0) {
      // 获取对应协议的默认端口号
      port = url.getDefaultPort();
    }
    return port;
  }
  /**
   * 获取Host部分
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static String parseHost(String href) throws IOException {
    //
    URL url = new URL(href);
    // 获取 host 部分
    String host = url.getHost();
    return host;
  }
  /**
   * 根据域名(host)解析IP地址
   *
   * @param host 域名
   * @return
   * @throws IOException
   */
  public static String parseIp(String host) throws IOException {
    // 根据域名查找IP地址
    InetAddress.getAllByName(host);
    InetAddress inetAddress = InetAddress.getByName(host);
    // IP 地址
    String address = inetAddress.getHostAddress();
    return address;
  }
}

네, 구체적인 상황에 맞게 캡슐화해서 처리해주세요.

위 내용은 Java에서 URL을 기반으로 DNS/IP 주소를 쿼리하는 방법입니다. 모든 분들께 도움이 되었으면 좋겠습니다.

관련 권장사항:

Java의 가변 길이 매개변수 코드에 대한 자세한 설명

Java 암호화, 암호 해독 및 디지털 서명의 전체 코드 예

PHP 프로그래머는 Java를 빠르게 개발할 수 있습니다

위 내용은 웹사이트 주소를 기반으로 DNS/IP 주소를 쿼리하는 Java 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.