ホームページ  >  記事  >  Java  >  Web サイトのアドレスに基づいて DNS/IP アドレスをクエリする Java メソッド

Web サイトのアドレスに基づいて DNS/IP アドレスをクエリする Java メソッド

小云云
小云云オリジナル
2017-12-06 10:21:182070ブラウズ

要件: 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 実装コードをご自身で参照してください。

ポート番号を取得するには2つの方法があります:

getPort()はURLで指定されたポート番号を取得します。指定されていない場合は、-1が返されます。

getDefaultPort() は、http プロトコルのデフォルトのポート番号は 80、https プロトコルのデフォルトのポート番号は 443 など、プロトコルに対応するデフォルトのポート番号を取得します。

次に、ホスト部分を抽出するコードを見てみましょう:

 /**
   * 获取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;
  }

基本的に、正規表現または文字列を使用してホストを直接インターセプトすることもできますが、複雑な状況に遭遇した場合、対処するのは簡単ではありません。例: 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;
  }
}

OK、特定の状況に応じて適切にカプセル化して処理してください。

上記の内容は、Java で URL に基づいて DNS/IP アドレスをクエリする方法です。皆様のお役に立てれば幸いです。

関連する推奨事項:

Java の可変長パラメーター コードの詳細な説明

Java 暗号化、復号化、およびデジタル署名の完全なコード例

PHP プログラマーは Java を迅速に開発できます

以上がWeb サイトのアドレスに基づいて DNS/IP アドレスをクエリする Java メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。