요구 사항: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!