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

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

小云云
풀어 주다: 2017-12-06 10:21:18
원래의
2238명이 탐색했습니다.

요구 사항: 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 클래스를 사용합니다. 포트 번호를 가져오는 코드는 다음과 같습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

  * 获取端口号

  *

  * @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 부분을 추출하는 코드를 살펴보겠습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/**

  * 获取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 주소를 찾을 수 있습니다.

코드는 다음과 같습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/**

  * 根据域名(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() 메소드를 통해 간단한 테스트를 진행합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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);

 }

로그인 후 복사

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

1

2

3

host=www.cncounter.com

port=80

address=198.11.179.83

로그인 후 복사

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿