Java examples for Network:Host
compare two host name to check if they are the same host without DNS resolving.
//package com.java2s; import sun.net.util.IPAddressUtil; public class Main { public static void main(String[] argv) throws Exception { String hostA = "java2s.com"; String hostB = "java2s.com"; System.out.println(ifSameHost(hostA, hostB)); }/* w w w . j av a 2s . co m*/ /** * 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 */ 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); return a == b; } else { for (int i = 0; i < 16; i++) { if (address1[i] != address2[i]) return false; } return true; } } return false; } private static int getInteger(byte[] addr) { int address = 0; if (addr != null) { if (addr.length == 4) { address = addr[3] & 0xFF; address |= ((addr[2] << 8) & 0xFF00); address |= ((addr[1] << 16) & 0xFF0000); address |= ((addr[0] << 24) & 0xFF000000); } } return address; } }