要件: 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 暗号化、復号化、およびデジタル署名の完全なコード例
以上がWeb サイトのアドレスに基づいて DNS/IP アドレスをクエリする Java メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。