====== 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'' 명령행에서 지정해야만 한다.