集册 Java实例教程 比较两个主机名,以检查它们是否为同一主机,而不进行DNS解析。

比较两个主机名,以检查它们是否为同一主机,而不进行DNS解析。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

584
提示:您可在线编辑运行本教程的实例 - 运行实例,去试试!
比较两个主机名,以检查它们是否为同一主机,而不进行DNS解析。


//package com.nowjava;
/* 
 来自 
*nowjava.com*/

import sun.net.util.IPAddressUtil;


public class Main {

    public static void main(String[] argv) throws Exception {

        String hostA = "nowjava.com";

        String hostB = "nowjava.com";

        System.out.println(ifSameHost(hostA, hostB));

    }


    /**

     *  This method is to compare two host name

     *  to check if they are the same host without DNS resolving.

     *  If the host name is IP address string, e.g., '2001:1b70:82a9:6100::9'

     *  the comparison supports to compare different format of same IP address.

     *

     *  If the host name is just an host name instead of IP address,

     *  it just compare the String by using

     *  String.equals(...)

     *

     * @param hostA

     * @param hostB

     * @return

     */
     /*
      from 时代Java公众号 - N o w J a  v a . c o m 
     */

    public static boolean ifSameHost(String hostA, String hostB) {


        boolean same = false;


        if (hostA == null && hostB == null) {

            return true;

        }


        byte[] addr1 = parseIpAddress(hostA);


        byte[] addr2 = parseIpAddress(hostB);


        //If this IP address string, compare the IP address

        if (addr1 != null && addr2 != null) {

            same = ifSameIpAddress(addr1, addr2);

        }


        //If this is host mame, just compare the host name string

        if (!same && hostA != null)

            same = hostA.equals(hostB);


        return same;

    }


    /**

     * This function parse the IP address string as a byte array

     * If the IP address is IPv4 address, the byte array length is 4

     * If the IP address is IPv6 address, the byte array length is 16

     * If the host is not an IP address string, will return null;

     * @param ipAddress

     * @return if this is valid IPv4 address or IPv6 address, return byte array for the address

     * otherwise return null.

     * So, this method can be used to check if the ipAddress string is valid or not

     */

    public static byte[] parseIpAddress(String ipAddress) {

        if (ipAddress == null)

            return null;

        boolean ipv6Expected = false;

        if (ipAddress.charAt(0) == '[') {

            // This is supposed to be an IPv6 literal

            if (ipAddress.length() > 2

                    && ipAddress.charAt(ipAddress.length() - 1) == ']') {

                ipAddress = ipAddress.substring(1, ipAddress.length() - 1);

                ipv6Expected = true;

            } else {

                // This was supposed to be a IPv6 address, but it's not!

                //throw new UnknownHostException(host + ": invalid IPv6 address");

                return null;

            }

        }


        // if host is an IP address, we won't do further lookup

        if (Character.digit(ipAddress.charAt(0), 16) != -1

                || (ipAddress.charAt(0) == ':')) {

            byte[] addressBytes = null;

            //            int numericZone = -1;

            //            String ifname = null;


            // see if it is IPv4 address

            addressBytes = IPAddressUtil.textToNumericFormatV4(ipAddress);

            if (addressBytes == null) {

                addressBytes = IPAddressUtil

                        .textToNumericFormatV6(ipAddress);

            } else if (ipv6Expected) {

                // Means an IPv4 litteral between brackets!

                //throw new UnknownHostException("["+host+"]");

                return null;

            }

            return addressBytes;


        } else if (ipv6Expected) {

            // We were expecting an IPv6 Litteral, but got something else

            //throw new UnknownHostException("["+host+"]");

            return null;

        }


        return null;

    }


    /**

     * Compare two IP address byte array, the length must be 4 or 16.

     * @param address1

     * @param address2

     * @return

     */

    private static boolean ifSameIpAddress(byte[] address1, byte[] address2) {

        if (address1 == null && address2 == null)

            return true;


        if (address1 != null && address2 != null

                && address1.length == address2.length) {

            //this IPv4 address

            if (address1.length == 4) {

                int a = getInteger(address1);

                int b = getInteger(address2);

                
展开阅读全文