Maison  >  Article  >  Java  >  Méthode Java pour interroger l'adresse DNS/IP en fonction de l'adresse du site Web

Méthode Java pour interroger l'adresse DNS/IP en fonction de l'adresse du site Web

小云云
小云云original
2017-12-06 10:21:182086parcourir

Exigence : étant donné une adresse URL, par exemple : http://www.cncounter.com/tools/shorturl.php, analysez l'adresse IP et le numéro de port correspondants.

Remarque : cet article n'implique pas le protocole DNS sous-jacent et utilise directement l'API fournie par la plateforme Java pour le fonctionnement.

DNS est Domain Name Service, qui est un service de nom de domaine.

Nous savons que les classes liées aux URL en Java incluent java.net.URL et java.net.URI, etc., où URI est un localisateur de ressources, qui peut inclure des protocoles tels que file:.

Nous utilisons donc ici la classe URL. Le code pour obtenir le numéro de port est le suivant :

 /**
   * 获取端口号
   *
   * @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;
  }

La classe URL existait. aux débuts de Java, une classe. La logique interne est relativement complexe. Si vous êtes intéressé, vous pouvez consulter vous-même le code d'implémentation du JDK correspondant.

Il existe deux méthodes pour obtenir le numéro de port :

getPort() consiste à obtenir le numéro de port spécifié dans l'URL. S'il n'est pas spécifié, -1 est renvoyé.

getDefaultPort() consiste à obtenir le numéro de port par défaut correspondant au protocole, tel que le numéro de port par défaut du protocole http est 80, le numéro de port par défaut du protocole https est 443, etc.

Regardons ensuite le code pour extraire la partie 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;
  }

Essentiellement, l'Host peut également être intercepté directement via expressions ou String , mais si vous rencontrez une situation compliquée, ce n'est pas facile à gérer, par exemple : une URL complexe comme https://yourname:passwd@gitee.com/mumu-osc/NiceFish.git.

Après avoir extrait le nom de domaine, vous pouvez utiliser la classe java.net.InetAddress pour trouver l'adresse IP.

Le code est le suivant :

 /**
   * 根据域名(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;
  }

Comme vous pouvez le voir, nous utilisons la méthode statique InetAddress.getByName() pour trouver la PI.

Cette classe fournit également d'autres méthodes statiques, mais elles sont généralement peu utilisées. Si vous êtes intéressé, vous pouvez cliquer sur le code open source pour y jeter un œil.

Ensuite, nous effectuons un test simple via la méthode 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); 
  }

Le résultat de l'exécution est :

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

Connaissant l'IP et le numéro de port, nous pouvons nous connecter directement via Socket.

Bien sûr, s'il s'agit du protocole http, vous pouvez utiliser l'outil HttpClient d'Apache, qui est puissant et simple à utiliser. Cependant, l'inconvénient de cette bibliothèque est que les différentes versions ne sont pas compatibles entre elles et que l'API est souvent modifiée lors de la programmation, elle doit être traitée en fonction d'un numéro de version spécifique.

Le code complet est le suivant :

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, veuillez l'encapsuler et le traiter de manière appropriée en fonction de la situation spécifique.

Le contenu ci-dessus explique comment interroger l'adresse DNS/IP en fonction de l'URL en Java. J'espère que cela pourra aider tout le monde.

Recommandations associées :

Explication détaillée du code de paramètre de longueur variable en Java

Exemple de code complet de cryptage, décryptage et signature numérique Java

Les programmeurs PHP peuvent développer rapidement Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn