====== Java Network ====== ===== Java Network Property ===== * [[http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html|Java network properties]] 6 * [[https://docs.oracle.com/javase/8/docs/api/java/net/doc-files/net-properties.html|Networking Properties]] 8 ===== DNS Cache ===== * [[http://kwon37xi.egloos.com/4455415|까먹지말자! : JVM의 DNS 캐시]] * ''networkaddress.cache.ttl'' : DNS Cache 시간. ''-1'' JVM 시작후 영원히 * ''networkaddress.cache.negative.ttl'' : Lookup 에 실패했을 경우 실패 사항에 대한 Cache 시간. * ''jre/lib/security/java.security'' 파일을 통해 설정 가능. * Oracle/Open JDK의 경우 ''-Dsun.net.inetaddr.ttl=30'' 처럼 ''sun.net.inetaddr.ttl'' 시스템 프라퍼티로 설정 가능. * 단, ''networkaddress.cache.ttl''이 설정 돼 있는 경우 ''sun.net.inetaddr.ttl''은 무시된다. * Java 6/7/8 의 경우 기본값 30초로 돼 있음. [[http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/net/InetAddressCachePolicy.java|OpenJdk 8 InetAddressCachePolicy]] * static context 에서 코드로 지정해줄 수도 있다. java.security.Security.setProperty("networkaddress.cache.ttl" , "30"); ===== Localhost의 IP 주소 목록 뽑기 ===== Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); List localIps = Lists.newArrayList(); while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); Enumeration inetAddresses = networkInterface.getInetAddresses(); while (inetAddresses.hasMoreElements()) { InetAddress inetAddress = inetAddresses.nextElement(); if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) { localIps.add(inetAddress.getHostAddress()); } } } ===== IP Address match ===== * [[http://www.java2s.com/Code/Java/Network-Protocol/CheckifIPaddressmatchpattern.htm|Check if IP address match pattern : IP Address « Network Protocol « Java]] /** * check if IP address match pattern * * @param pattern * *.*.*.* , 192.168.1.0-255 , * * @param address * - 192.168.1.1
* address = 10.2.88.12 pattern = *.*.*.* result: true
* address = 10.2.88.12 pattern = * result: true
* address = 10.2.88.12 pattern = 10.2.88.12-13 result: true
* address = 10.2.88.12 pattern = 10.2.88.13-125 result: false
* @return true if address match pattern */ public static boolean checkIPMatching(String pattern, String address) { if (pattern.equals("*.*.*.*") || pattern.equals("*")) return true; String[] mask = pattern.split("\\."); String[] ip_address = address.split("\\."); for (int i = 0; i < mask.length; i++) { if (mask[i].equals("*") || mask[i].equals(ip_address[i])) continue; else if (mask[i].contains("-")) { byte min = Byte.parseByte(mask[i].split("-")[0]); byte max = Byte.parseByte(mask[i].split("-")[1]); byte ip = Byte.parseByte(ip_address[i]); if (ip < min || ip > max) return false; } else return false; } return true; }
* [[http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html|Apache Commons net SubnetUtils]]를 사용할 수도 있다. ===== java.net.URL ===== * [[http://hackeen.tistory.com/18|[java 네트워크 프로그래밍] 6. URL 클래스 :: hackeen]] ===== IPv4 강제하기 ===== * 환경에 따라 IPv6를 우선으로 하면서 ''invalid IPv6 address'' 같은 오류가 발생할 수 있는데, 이 경우 System Property로 다음을 지정해야 한다. -Djava.net.preferIPv4Stack=true 위 항목을 Java Code에서 지정하면 작동하지 않고, ''java'' 명령행에서 지정해야만 한다.