package org.kne.cloud.network.klalb; import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.List; import java.util.UUID; import java.util.concurrent.LinkedBlockingQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.kne.cloud.network.MultipurposeSocketAddress; public class KLALBUtils { public static Inet6Address uuidToIP(UUID uuid) { ByteArrayOutputStream bos=new ByteArrayOutputStream(8); DataOutputStream dos=new DataOutputStream(bos); try { long l=uuid.getMostSignificantBits(); l=(l&0x0000FFFFFFFFFFFFL)|0x2486000000000000L; dos.writeLong(l); dos.writeLong(uuid.getLeastSignificantBits()); dos.close();} catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } try { return (Inet6Address) Inet6Address.getByAddress(bos.toByteArray()); } catch (UnknownHostException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return null; } public static void main(String[] args) { System.out.println(uuidToIP(new UUID(-1,-1))); } public static String bytesUnit(long v) { if (v >= 1024L * 1024 * 1024 * 1024 * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)) + "PB"; } else if (v >= 1024L * 1024 * 1024 * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0)) + "TB"; } else if (v >= 1024L * 1024 * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0 * 1024.0)) + "GB"; } else if (v >= 1024L * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0)) + "MB"; } else if (v >= 1024L) { return String.format("%.2f", v / (1024.0)) + "KB"; } else { return v + "B"; } } public static String bytesUnitSimp(long v) { if(v>=1024L*1024*1024*1024*1024) { return format( v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"P"; }else if(v>=1024L*1024*1024*1024) { return format (v/(1024.0*1024.0*1024.0*1024.0))+"T"; }else if(v>=1024L*1024*1024) { return format( v/(1024.0*1024.0*1024.0))+"G"; }else if(v>=1024L*1024) { return format( v/(1024.0*1024.0))+"M"; }else if(v>=1024L) { return format( v/(1024.0))+"K"; }else { return v+"B"; } } public static String defaultUnit(long v) { if(v>=1024L*1024*1024*1024*1024) { return format( v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"P"; }else if(v>=1024L*1024*1024*1024) { return format (v/(1024.0*1024.0*1024.0*1024.0))+"T"; }else if(v>=1024L*1024*1024) { return format( v/(1024.0*1024.0*1024.0))+"G"; }else if(v>=1024L*1024) { return format( v/(1024.0*1024.0))+"M"; }else if(v>=1024L) { return format( v/(1024.0))+"K"; }else { return Long.toString(v) ; } } private static String format( double d) { String fmt=String.format( "%.2f",d); if(fmt.length()>4) { fmt=fmt.substring(0, 4); } if(fmt.endsWith(".")) { fmt=fmt.substring(0, fmt.length()-1); } return fmt; } public static int binarySearchDATATPacketNumber(Listlst,long number) { int low =0; int high=lst.size()-1; int middle=0; if(low>high||numberlst.get(high).getNumber()) { return -1; } while(low<=high) { middle=(low+high)/2; long xn=lst.get(middle).getNumber(); if(xn>number) { high=middle-1; }else if(xn255) r=255; if(r<0) r=0; if(g>255) g=255; if(g<0) g=0; Color col=new Color( r,g,0); return col; } public static Color getColorByLoadPercentagex(float f) { int r=0; int g=200; if(f<50f) { r+=f/50f*200f; }else { r=200; g-=(f-50f)/50f*200f; } if(r>200) r=200; if(r<0) r=0; if(g>200) g=200; if(g<0) g=0; Color col=new Color( r,g,0); return col; } public static KLALBPacketLink createKLALBPacketLink(MultipurposeSocketAddress bindAddress, MultipurposeSocketAddress targetAddress,boolean buffered) throws IOException { if (targetAddress.isStream()) { if (targetAddress.supportNIO()) { if (bindAddress != null) { return new StreamChannelKLALBPacketLink(targetAddress .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort())); } else { return new StreamChannelKLALBPacketLink(targetAddress.connectSocketChannel()); } } else { if (bindAddress != null) { return new StreamKLALBPacketLink( targetAddress.connectSocket(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort())); } else { return new StreamKLALBPacketLink(targetAddress.connectSocket()); } } } else { if (bindAddress != null) { return new SplitedDatagramKLALBPacketLink( targetAddress.connectDatagramSocket(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort())); } else { return new SplitedDatagramKLALBPacketLink(targetAddress.connectDatagramSocket()); } } } public static KLALBPacketLink createKLALBPacketLink(MultipurposeSocketAddress bindAddress, MultipurposeSocketAddress targetAddress,boolean buffered, int timeout) throws UnknownHostException, IOException { if (targetAddress.isStream()) { if (targetAddress.supportNIO()) { if (bindAddress != null) { if(buffered) { return new StreamChannelKLALBPacketLink(targetAddress .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout)); }else { return new StreamChannelKLALBPacketLink(targetAddress .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout)); } } else { if(buffered) { return new StreamChannelKLALBPacketLink(targetAddress.connectSocketChannel(timeout)); }else { return new StreamChannelKLALBPacketLink(targetAddress.connectSocketChannel(timeout)); } } } else { if (bindAddress != null) { return new StreamKLALBPacketLink( targetAddress.connectSocket(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout)); } else { return new StreamKLALBPacketLink(targetAddress.connectSocket(timeout)); } } } else { if (bindAddress != null) { return new SplitedDatagramKLALBPacketLink( targetAddress.connectDatagramSocket(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort())); } else { return new SplitedDatagramKLALBPacketLink(targetAddress.connectDatagramSocket()); } } } public static final String IPv6Reg = "([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$" + "|^:((:[\\da-fA-F]{1,4}){1,6}|:)$" + "|^[\\da-fA-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)$" + "|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)$" + "|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3}|:)$" + "|^([\\da-fA-F]{1,4}:){4}((:[\\da-fA-F]{1,4}){1,2}|:)$" + "|^([\\da-fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?$" + "|^([\\da-fA-F]{1,4}:){6}:"; // IPv6地址的格式 /** * 将一个IPv6地址转为全写格式,全写中的前导0省略 * 例:将1ade:03da:0::转为1ade:3da:0:0:0:0:0:0 * * @param IPv6Str * @return fullIPv6 */ public static String parseFullIPv6(String IPv6Str) { // 判断IPv6地址的格式是否正确 if (!IPv6Str.matches(IPv6Reg)) { return ""; } String[] arr = new String[]{"0", "0", "0", "0", "0", "0", "0", "0"}; // 将IPv6地址用::分开 // 如果IPv6地址为::,tempArr.length==0 // 如果不包含::或以::结尾,tempArr.length==1 // 如果以::开头或::在中间,tempArr.length==2 String[] tempArr = IPv6Str.split("::"); // tempArr[0]用:分开,填充到arr前半部分 if (tempArr.length > 0) { // new String[0]为空数组,因为"".split(":")为{""},如果tempArr[0]=="",此时数组包含一个元素 String[] tempArr0 = tempArr[0].isEmpty() ? new String[0] : tempArr[0].split(":"); for (int i = 0; i < tempArr0.length; i++) { // 如果是纯数字,用parseInt去除前导0,如果包含字母,用正则去除前导0 arr[i] = tempArr0[i].matches("\\d+") ? (Integer.parseInt(tempArr0[i]) + "") : tempArr0[i].replaceAll("^(0+)", ""); } } // tempArr[1]用:分开,填充到arr后半部分 if (tempArr.length > 1) { String[] tempArr1 = tempArr[1].isEmpty() ? new String[0] : tempArr[1].split(":"); for (int i = 0; i < tempArr1.length; i++) { arr[i + arr.length - tempArr1.length] = tempArr1[i].matches("\\d+") ? (Integer.parseInt(tempArr1[i]) + "") : tempArr1[i].replaceAll("^(0+)", ""); } } return join(arr, ":"); } private static String join(String[] arr, String string) { StringBuilder sb=new StringBuilder(); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]); if(i+1 0) { for (int i = start; i < end; i++) { arr[i] = ":"; } } return join(arr, ":").replaceAll(":{2,}", "::"); } }