diff --git a/.classpath b/.classpath index ead61f4..5830d28 100644 --- a/.classpath +++ b/.classpath @@ -5,7 +5,13 @@ + + + + + + diff --git a/klalb-config.json b/klalb-config.json new file mode 100644 index 0000000..e1d69a5 --- /dev/null +++ b/klalb-config.json @@ -0,0 +1 @@ +[{"language":"ZH_CN","nogui":false,"VirtualAddress":"2486:1:0:0:0:0:0:8888","DNS":["2486:1:0:0:0:0:0:8888"],"TCPListen":"0.0.0.0:4565","UDPListen":"{UDP}0.0.0.0:4572","VirtualSocketName":"KLALB_Stream","LineTable":["07f4acdef99b.ofalias.net:4565"],"ConnectLineTable":[],"Type":"KLALBController"},{"Listen":"0.0.0.0:4572","Bridge":{"KLALB":"SocketBridge","RDP":"SocketBridge","HTTP":"SocketBridge","HTTPS":"SocketBridge","DEFAULT":"MinecraftSocketBridge23332"},"Connect":{"KLALB":"127.0.0.1:4565","RDP":"127.0.0.1:3389","HTTP":"127.0.0.1:5212","HTTPS":"192.168.1.235:443","DEFAULT":"127.0.0.1:36555"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23332","Bridge":{"DEFAULT":"MinecraftSocketBridge23332"},"Connect":{"DEFAULT":"127.0.0.1:36555"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23333","Bridge":{"DEFAULT":"SocketBridge"},"Connect":{"DEFAULT":"127.0.0.1:5212"},"Type":"SocketBridge"},{"Listen":"0.0.0.0:25561","Bridge":{"KLALB":"SocketBridge","DEFAULT":"MinecraftSocketBridge23330"},"Connect":{"KLALB":"127.0.0.1:4565","DEFAULT":"127.0.0.1:25562"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23330","Bridge":{"DEFAULT":"MinecraftSocketBridge23330"},"Connect":{"DEFAULT":"127.0.0.1:25562"},"Type":"SocketBridge"}] \ No newline at end of file diff --git a/klalbconfig.json b/klalbconfig.json deleted file mode 100644 index 41027f4..0000000 --- a/klalbconfig.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - {"Type":"KLALBController" ,"VirtualAddress":"2486:1:34de:4abd:98c1:abd1:fc7a:401", - "TCPListen" : "0.0.0.0:4565", - "UDPListen" : "{UDP}0.0.0.0:4572", - "VirtualSocketName" : "KLALB_Stream", - "LineTable":["07f4acdef99b.ofalias.net:4572","{UDP}07f4acdef99b.ofalias.net:4572"] - }, - {"Type":"SocketBridge" , - "Listen" : "0.0.0.0:4572", -"Bridge":{ - "KLALB" : "SocketBridge", - "RDP":"SocketBridge", - "HTTP":"SocketBridge", - "HTTPS":"SocketBridge", - "DEFAULT":"MinecraftSocketBridge23332" - } , - "Connect" : { - "KLALB" : "127.0.0.1:4565", - "RDP":"127.0.0.1:3389", - "HTTP":"127.0.0.1:5212", - "HTTPS":"192.168.1.235:443", - "DEFAULT":"127.0.0.1:36555" - } - }, - {"Type":"SocketBridge" , - "Listen" : "{KLALB_Stream}[::0]:23332", -"Bridge":"MinecraftSocketBridge23332", - "Connect" : "127.0.0.1:36555" - }, - { "Type":"SocketBridge" , - "Listen" : "{KLALB_Stream}[::0]:23333", -"Bridge":"SocketBridge", - "Connect" : "127.0.0.1:5212" - }, - - - - - - {"Type":"SocketBridge" , - "Listen" : "0.0.0.0:25561", -"Bridge":{ - "KLALB" : "SocketBridge", - "DEFAULT":"MinecraftSocketBridge23330" - } , - "Connect" : { - "KLALB" : "127.0.0.1:4565", - "DEFAULT":"127.0.0.1:25562" - } - }, - {"Type":"SocketBridge" , - "Listen" : "{KLALB_Stream}[::0]:23330", -"Bridge":"MinecraftSocketBridge23330", - "Connect" : "127.0.0.1:25562" - } -] \ No newline at end of file diff --git a/src/assets/ipv6router1.png b/src/assets/ipv6router1.png new file mode 100644 index 0000000..8b6bcab Binary files /dev/null and b/src/assets/ipv6router1.png differ diff --git a/src/assets/ipv6router2.png b/src/assets/ipv6router2.png new file mode 100644 index 0000000..aaa4b0e Binary files /dev/null and b/src/assets/ipv6router2.png differ diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties new file mode 100644 index 0000000..f965e39 --- /dev/null +++ b/src/klalb_en_US.properties @@ -0,0 +1,47 @@ +srv6acc=SRv6 network accelerator system +networkgraph=Network graph +language=Language +basicsettings=Basic settings +ipv6addr=IPv6 address +dnsserver=DNS server +asnumber=AS number +tcplistening=TCP listening +udplistening=UDP listening +openlinetable=Open line table +autoconnectlinetable=Auto connect line table +advancedsettings=Advanced settings +congresscontrolalgorithm=Congress control algorithm +savesettings=Save settings +locate=Locate +find=Find +home=Home +uploadspeed=Upload speed +downloadspeed=Download speed +uploadpps=Upload PPS +downloadpps=Download PPS +copy=Copy +onlinedevices=Online devices +monitor=Monitor +showofflines=Show offline remotelines +lineaddressport=Line address:port +addline=Add line +reconnectall=Reconnect All +remotelines=Remote lines +settings=Settings +saveconfigsuccess=Save config success +warning=Warning +invaildipv6addr=IPv6 address:Invaild Input +invailddnsserver=DNS server:Invaild Input +invaildasnumber=AS number:Invaild Input +invaildtcplisten=TCP listen:Invaild Input +invaildudplisten=UDP listen:Invaild Input +invaildopenlinetable=Open line table:Invaild Input +invaildconnectlinetable=Connect line table:Invaild Input +unknown=Unknown +viewlinemonitor=View line monitor +copylineaddress=Copy line address +copyvirtualaddress=Copy virtual address +tryreconnect=Try reconnect +forcedisconnect=Force disconnect +removeline=Remove line + diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties new file mode 100644 index 0000000..6cd332b --- /dev/null +++ b/src/klalb_zh_CN.properties @@ -0,0 +1,47 @@ +srv6acc=SRv6 网络加速系统 +networkgraph=网络拓扑图 +language=语言 +basicsettings=基本设置 +ipv6addr=IPv6地址 +dnsserver=DNS服务器 +asnumber=AS号码 +tcplistening=TCP监听端口 +udplistening=UDP监听端口 +openlinetable=开放线路列表 +autoconnectlinetable=自动连接线路列表 +advancedsettings=高级设置 +congresscontrolalgorithm=拥塞控制算法 +savesettings=保存设置 +locate=定位 +find=查找 +home=本机 +uploadspeed=上传速度 +downloadspeed=下载速度 +uploadpps=上传包转发率 +downloadpps=下载包转发率 +copy=复制 +onlinedevices=在线设备 +monitor=监视器 +showofflines=显示离线远程链路 +lineaddressport=链路地址:端口 +addline=添加链路 +reconnectall=全部重连 +remotelines=远程链路 +settings=设置 +saveconfigsuccess=保存配置成功 +warning=警告 +invaildipv6addr=IPv6地址:非法输入 +invailddnsserver=DNS服务器:非法输入 +invaildasnumber=AS号码:非法输入 +invaildtcplisten=TCP监听端口:非法输入 +invaildudplisten=UDP监听端口:非法输入 +invaildopenlinetable=开放线路列表:非法输入 +invaildconnectlinetable=自动连接线路列表:非法输入 +unknown=未知 +viewlinemonitor=打开链路监视器 +copylineaddress=复制链路地址 +copyvirtualaddress=复制虚拟地址 +tryreconnect=立即尝试重连 +forcedisconnect=强制断开连接 +removeline=强制断开连接并移除 + diff --git a/src/org/kne/cloud/network/ByteBufferAllocator.java b/src/org/kne/cloud/network/ByteBufferAllocator.java index b331444..bdb6017 100644 --- a/src/org/kne/cloud/network/ByteBufferAllocator.java +++ b/src/org/kne/cloud/network/ByteBufferAllocator.java @@ -5,6 +5,8 @@ import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -13,6 +15,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import org.kne.debug.TimeDebugger; + +import jdk.internal.misc.Unsafe; public class ByteBufferAllocator { private List bbfps=new ArrayList<>(); @@ -75,9 +79,38 @@ public class ByteBufferAllocator { new ByteBufferPhantomReference(bbfs,refq,bbf,bbfp); return bbfs; } - private static ByteBuffer allocateHeap(int capacity) { - return ByteBuffer.wrap(new byte[capacity]); + private static jdk.internal.misc.Unsafe usf; + private static Method meth; + static { + Class name; + try { + name = Class.forName("jdk.internal.misc.Unsafe"); + Field field = name.getDeclaredField("theUnsafe"); + field.setAccessible(true); + usf= (Unsafe) field.get(null); + meth=name.getMethod("allocateUninitializedArray", Class.class,int.class); + + } catch (java.lang.reflect.InaccessibleObjectException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } } + + private static ByteBuffer allocateHeap(int capacity) { + //return ByteBuffer.wrap((byte[]) usf.allocateUninitializedArray(byte.class, capacity)); + if(usf!=null&&meth!=null) { + try { + return ByteBuffer.wrap((byte[]) usf.allocateUninitializedArray(byte.class, capacity)); + } catch (Exception e) { + return ByteBuffer.wrap(new byte[capacity]); + } + }else { + return ByteBuffer.wrap(new byte[capacity]); + } + } + + private ByteBufferPool getByteBufferPool(int capacity) { int elen=0; for (int i = 0; i < bbfps.size(); i++) { diff --git a/src/org/kne/cloud/network/IPMulticastDiscovery.java b/src/org/kne/cloud/network/IPMulticastDiscovery.java index 9294e3a..a90ec9a 100644 --- a/src/org/kne/cloud/network/IPMulticastDiscovery.java +++ b/src/org/kne/cloud/network/IPMulticastDiscovery.java @@ -81,6 +81,7 @@ public class IPMulticastDiscovery extends Thread implements Closeable, AutoClose try { while (!closed) { HashSet s = new HashSet(); + synchronized (msas) { for (Iterator iterator = msas.iterator(); iterator.hasNext();) { MultipurposeSocketAddress multipurposeSocketAddress = (MultipurposeSocketAddress) iterator .next(); @@ -113,6 +114,7 @@ public class IPMulticastDiscovery extends Thread implements Closeable, AutoClose } catch (NoRouteToHostException|UnknownHostException e) { } + } } Thread.sleep(timeInterval); diff --git a/src/org/kne/cloud/network/MultipurposeSocketAddress.java b/src/org/kne/cloud/network/MultipurposeSocketAddress.java index 1b039fd..5d411d0 100644 --- a/src/org/kne/cloud/network/MultipurposeSocketAddress.java +++ b/src/org/kne/cloud/network/MultipurposeSocketAddress.java @@ -2,6 +2,7 @@ package org.kne.cloud.network; import java.io.IOException; import java.io.Serializable; +import java.lang.reflect.Type; import java.net.DatagramSocket; import java.net.Inet6Address; import java.net.InetAddress; @@ -17,6 +18,16 @@ import java.util.*; import javax.net.ServerSocketFactory; import javax.net.SocketFactory; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + public class MultipurposeSocketAddress implements Serializable{ /** * @@ -141,8 +152,14 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } Socket s=sf.createSocket(); + try { s.bind(new InetSocketAddress(bindip, bindport)); s.connect(new InetSocketAddress(host, port),timeout); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } public Socket connectSocket(InetAddress bindip,int bindport) throws UnknownHostException, IOException { @@ -151,8 +168,14 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } Socket s=sf.createSocket(); + try { s.bind(new InetSocketAddress(bindip, bindport)); s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } public Socket connectSocket() throws UnknownHostException, IOException { @@ -161,7 +184,13 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } Socket s=sf.createSocket(); + try { s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } public Socket connectSocket(int timeout) throws UnknownHostException, IOException { @@ -170,7 +199,13 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } Socket s=sf.createSocket(); + try { s.connect(new InetSocketAddress(host, port),timeout); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } @@ -186,10 +221,16 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } SocketChannel s=sf.createSocketChannel(); - s.bind(new InetSocketAddress(bindip, bindport)); - TimerTask tt=tmoTimer.createTimeOutTask(s, timeout); + TimerTask tt=null; try { + s.bind(new InetSocketAddress(bindip, bindport)); + tt=tmoTimer.createTimeOutTask(s, timeout); + s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; }finally { if(tt!=null) tt.cancel(); @@ -202,8 +243,14 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } SocketChannel s=sf.createSocketChannel(); + try { s.bind(new InetSocketAddress(bindip, bindport)); s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } public SocketChannel connectSocketChannel() throws UnknownHostException, IOException { @@ -212,7 +259,13 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("Socket Unsupported"); } SocketChannel s=sf.createSocketChannel(); + try { s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; + } return s; } public SocketChannel connectSocketChannel(int timeout) throws UnknownHostException, IOException { @@ -225,6 +278,10 @@ public class MultipurposeSocketAddress implements Serializable{ TimerTask tt=tmoTimer.createTimeOutTask(s, timeout); try { s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + System.gc(); + throw e; }finally { if(tt!=null) tt.cancel(); @@ -285,8 +342,14 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("DatagramSocket Unsupported"); } DatagramSocket dgd=dgs.createSocket(); + try { dgd.bind(new InetSocketAddress(bindip, bindport)); dgd.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + dgd.close(); + System.gc(); + throw e; + } return dgd; } public DatagramSocket connectDatagramSocket() throws IOException { @@ -295,7 +358,13 @@ public class MultipurposeSocketAddress implements Serializable{ throw new UnsupportedOperationException("DatagramSocket Unsupported"); } DatagramSocket dgd=dgs.createSocket(); + try { dgd.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + dgd.close(); + System.gc(); + throw e; + } return dgd; } public DatagramServerSocket listenDatagramServerSocket() throws UnknownHostException, IOException { @@ -330,4 +399,35 @@ public class MultipurposeSocketAddress implements Serializable{ return true; } } + + public static JsonDeserializergetDefaultJsonDeserializer(){ + return new JsonDeserializer() { + + @Override + public MultipurposeSocketAddress deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) + throws JsonParseException { + if(arg0.isJsonPrimitive()) { + JsonPrimitive jp=(JsonPrimitive) arg0; + if(jp.isString()) { + return new MultipurposeSocketAddress(jp.getAsString()); + } + } + throw new JsonParseException("not a string:"+arg0); + } + }; + } + public static JsonSerializergetDefaultJsonSerializer(){ + return new JsonSerializer() { + + @Override + public JsonElement serialize(MultipurposeSocketAddress arg0, Type arg1, JsonSerializationContext arg2) { + return new JsonPrimitive(arg0.toString()); + } + }; + } + + public static void registerToGsonBuilder(GsonBuilder gsonBuilder) { + gsonBuilder.registerTypeAdapter(MultipurposeSocketAddress.class, getDefaultJsonDeserializer()); + gsonBuilder.registerTypeAdapter(MultipurposeSocketAddress.class, getDefaultJsonSerializer()); + } } diff --git a/src/org/kne/cloud/network/PortRelay.java b/src/org/kne/cloud/network/PortRelay.java index 78123b0..cade983 100644 --- a/src/org/kne/cloud/network/PortRelay.java +++ b/src/org/kne/cloud/network/PortRelay.java @@ -36,7 +36,8 @@ public class PortRelay { + "-" + "(" + nx + ")->" + hp.getHost() + ":" + hp.getPort()); try { sl=hp.connectSocket(); - + s.setSoTimeout(120*60*1000); + sl.setSoTimeout(120*60*1000); new SocketBridge(s, sl).run(); } catch (IOException e) { e.printStackTrace(); diff --git a/src/org/kne/cloud/network/SocketToSocketProxy.java b/src/org/kne/cloud/network/SocketToSocketProxy.java index 53c8367..63896ee 100644 --- a/src/org/kne/cloud/network/SocketToSocketProxy.java +++ b/src/org/kne/cloud/network/SocketToSocketProxy.java @@ -20,6 +20,15 @@ public class SocketToSocketProxy extends Proxy { private SocketBridgeFactory defaultFactory; private SocketChannelBridgeFactory defaultChannelFactory; private Map detectedFactory; + private int defaultSoTimeout=120*60*1000; + + public int getDefaultSoTimeout() { + return defaultSoTimeout; + } + + public void setDefaultSoTimeout(int defaultSoTimeout) { + this.defaultSoTimeout = defaultSoTimeout; + } public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress connect) throws IOException { this(listen, new MultipurposeSocketAddress(new InetSocketAddress(0)), connect); @@ -152,6 +161,8 @@ public class SocketToSocketProxy extends Proxy { protected void runBridge(SocketBridgeFactory sbf,Socket sk, Socket sox) throws IOException { + sk.setSoTimeout(defaultSoTimeout); + sox.setSoTimeout(defaultSoTimeout); sk.setTcpNoDelay(true); sox.setTcpNoDelay(true); SocketBridge sb = sbf.createBridge(sk, sox); @@ -159,6 +170,8 @@ public class SocketToSocketProxy extends Proxy { } protected void runChannelBridge(SocketChannelBridgeFactory sbf,SocketChannel sk, SocketChannel sox) throws IOException { + //sk.setSoTimeout(defaultSoTimeout); + //sox.setSoTimeout(defaultSoTimeout); sk.setOption(StandardSocketOptions.TCP_NODELAY, true); sox.setOption(StandardSocketOptions.TCP_NODELAY, true); SocketChannelBridge sb = sbf.createBridge(sk, sox); diff --git a/src/org/kne/cloud/network/ipv6/IPv6Packet.java b/src/org/kne/cloud/network/ipv6/IPv6Packet.java index 6da7cf6..f50b8cc 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6Packet.java +++ b/src/org/kne/cloud/network/ipv6/IPv6Packet.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader; @@ -718,7 +719,7 @@ public class IPv6Packet extends NetworkPacket { //System.out.println("SR length:"+(laste+1)); addresses.clear(); - ByteBuffer bfr=ByteBuffer.allocate(16); + ByteBuffer bfr=NetworkPacket.bufferAllocator.allocate(16); for (int i = 0; i < (laste+1); i++) { bfr.clear(); while (bfr.hasRemaining()) { diff --git a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java index ba438e9..5372959 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java +++ b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java @@ -141,7 +141,7 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A e.printStackTrace(); } } - LockSupport.parkNanos(1000000L); + LockSupport.parkNanos(10000000L); } } diff --git a/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java index 75c59e8..632cec7 100644 --- a/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java @@ -9,7 +9,15 @@ import org.kne.cloud.network.NetworkPacket; import org.kne.io.KNEChannels; public abstract class AbstractKLALBPacketLink implements KLALBPacketLink { + private static int defaultSoTimeout=60*1000; + + public static int getDefaultSoTimeout() { + return defaultSoTimeout; + } + public static void setDefaultSoTimeout(int defaultSoTimeout) { + AbstractKLALBPacketLink.defaultSoTimeout = defaultSoTimeout; + } private AtomicLong[] inputTrafficCounters; private AtomicLong[] outputTrafficCounters; diff --git a/src/org/kne/cloud/network/klalb/KLALBConfig.java b/src/org/kne/cloud/network/klalb/KLALBConfig.java new file mode 100644 index 0000000..756e059 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBConfig.java @@ -0,0 +1,47 @@ +package org.kne.cloud.network.klalb; + +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Type; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; + +import javax.annotation.processing.Filer; +import javax.lang.model.element.Element; +import javax.tools.FileObject; +import javax.tools.JavaFileObject; +import javax.tools.JavaFileManager.Location; + +import org.kne.cloud.network.MultipurposeSocketAddress; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonIOException; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.JsonSyntaxException; + +import java.io.File; +import java.io.FileNotFoundException; + +public class KLALBConfig extends ArrayList{ + public static void main(String[] args) throws UnknownHostException, JsonSyntaxException, JsonIOException, FileNotFoundException { + GsonBuilder gb=new GsonBuilder(); + MultipurposeSocketAddress.registerToGsonBuilder(gb); + KLALBConfigItem.registerToGsonBuilder(gb); + Gson gson=gb.create(); + KLALBConfig kc=gson.fromJson(new FileReader(new File("klalb-config.json")),KLALBConfig.class); + System.out.println(kc); + String s=gson.toJson(kc); + System.out.println(s); + + } + + +} diff --git a/src/org/kne/cloud/network/klalb/KLALBConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBConfigItem.java new file mode 100644 index 0000000..2ec5b02 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBConfigItem.java @@ -0,0 +1,103 @@ +package org.kne.cloud.network.klalb; + +import java.lang.reflect.Type; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.kne.cloud.network.MultipurposeSocketAddress; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.reflect.TypeToken; + +public class KLALBConfigItem { + private String Type; + + public String getType() { + return Type; + } + + public void setType(String type) { + Type = type; + } + + @Override + public String toString() { + return "KLALBConfigItem [Type=" + Type + "]"; + } + + public KLALBConfigItem(String type) { + super(); + Type = type; + } + + @Override + public int hashCode() { + return Objects.hash(Type); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + KLALBConfigItem other = (KLALBConfigItem) obj; + return Objects.equals(Type, other.Type); + } + public static JsonDeserializergetDefaultJsonDeserializer(){ + return new JsonDeserializer() { + + @Override + public KLALBConfigItem deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) + throws JsonParseException { + if(arg0.isJsonObject()) { + JsonObject jobj=(JsonObject) arg0; + String s=jobj.get("Type").getAsString(); + switch(s) { + case "KLALBController": + return arg2.deserialize(arg0, new TypeToken() {}.getType()); + case "SocketBridge": + return arg2.deserialize(arg0, new TypeToken() {}.getType()); + default: + return arg2.deserialize(arg0, new TypeToken() {}.getType()); + } + } + throw new JsonParseException("not a object:"+arg0); + } + }; + } + public static JsonSerializergetDefaultJsonSerializer(){ + return new JsonSerializer() { + + @Override + public JsonElement serialize(KLALBConfigItem arg0, Type arg1, JsonSerializationContext arg2) { + if(arg0 instanceof KLALBControllerConfigItem) { + return arg2.serialize(arg0, new TypeToken() {}.getType()); + } + if(arg0 instanceof SocketBridgeConfigItem) { + return arg2.serialize(arg0, new TypeToken() {}.getType()); + } + return arg2.serialize(arg0, new TypeToken() {}.getType()); + } + }; + } + + public static void registerToGsonBuilder(GsonBuilder gsonBuilder) { + gsonBuilder.registerTypeAdapter(KLALBConfigItem.class, getDefaultJsonDeserializer()); + gsonBuilder.registerTypeAdapter(KLALBConfigItem.class, getDefaultJsonSerializer()); + } +} diff --git a/src/org/kne/cloud/network/klalb/KLALBController.java b/src/org/kne/cloud/network/klalb/KLALBController.java index 4731719..312d9be 100644 --- a/src/org/kne/cloud/network/klalb/KLALBController.java +++ b/src/org/kne/cloud/network/klalb/KLALBController.java @@ -79,7 +79,7 @@ public class KLALBController { private static final boolean showpacket = false; - private static final int PREFIX = 112; + private static final int PREFIX = 128;//112 private static final int DISCOVERY_PORT=4569; private static List ipmd=new ArrayList<>(); @@ -168,25 +168,33 @@ public class KLALBController { for (Iterator iterator = st.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress multipurposeSocketAddress = (MultipurposeSocketAddress) iterator + MultipurposeSocketAddress target = (MultipurposeSocketAddress) iterator .next(); - for (Iterator iterator2 = localaddress.iterator(); iterator2.hasNext();) { + addRemoteLines(target); + /*for (Iterator iterator2 = localaddress.iterator(); iterator2.hasNext();) { MultipurposeSocketAddress bind = (MultipurposeSocketAddress) iterator2 .next(); try { - if(multipurposeSocketAddress.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() instanceof Inet6Address) { + if(target.getInetAddress().isLoopbackAddress() &&(!bind.getInetAddress().isLoopbackAddress())) { continue; } - if(multipurposeSocketAddress.getInetAddress() instanceof Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { + if((!target.getInetAddress().isLoopbackAddress()) &&bind.getInetAddress().isLoopbackAddress()) { + continue; + } + if(target.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() instanceof Inet6Address) { + continue; + } + if(target.getInetAddress() instanceof Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { continue; } } catch (UnknownHostException e) { + if(e.getMessage().toLowerCase().contains("no scope_id found")) } - if(!checkContainsTargetAndBind(multipurposeSocketAddress,bind)) { + if(!checkContainsTargetAndBind(target,bind)) { //System.out.println(target+" "+bind); - addRemoteLine( new KLALBRemoteLine(multipurposeSocketAddress,bind)); + addRemoteLine( new KLALBRemoteLine(target,bind)); } - } + }*/ } for (Iterator iterator = lines.iterator(); iterator.hasNext();) { @@ -404,7 +412,8 @@ public class KLALBController { } - public List addRemoteLines(MultipurposeSocketAddress target) {lineslock.writeLock().lock(); + public List addRemoteLines(MultipurposeSocketAddress target) { + lineslock.writeLock().lock(); try { Listadded=new ArrayList<>(); try { @@ -416,21 +425,36 @@ public class KLALBController { Enumerationei= networkInterface.getInetAddresses(); while (ei.hasMoreElements()) { InetAddress inetAddress = (InetAddress) ei.nextElement(); + try { MultipurposeSocketAddress bind=new MultipurposeSocketAddress(inetAddress.getHostAddress(),0); try { + if(target.getInetAddress().isLoopbackAddress() &&(!bind.getInetAddress().isLoopbackAddress())) { + continue; + } + if((!target.getInetAddress().isLoopbackAddress()) &&bind.getInetAddress().isLoopbackAddress()) { + continue; + } if(target.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() instanceof Inet6Address) { continue; } if(target.getInetAddress() instanceof Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { continue; } + //System.out.println(target+"->"+bind); } catch (UnknownHostException e) { + if(e.getMessage().trim().toLowerCase().contains("no scope_id found")) { + throw e; + } + //e.printStackTrace(); } if(!checkContainsTargetAndBind(target,bind)) { KLALBRemoteLine line=new KLALBRemoteLine(target,bind); addRemoteLine(line ); added.add(line); } + } catch (UnknownHostException e) { + + } } } } diff --git a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java new file mode 100644 index 0000000..eb1199b --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java @@ -0,0 +1,214 @@ +package org.kne.cloud.network.klalb; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.kne.cloud.network.MultipurposeSocketAddress; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class KLALBControllerConfigItem extends KLALBConfigItem { + private String language; + private boolean nogui; + private String VirtualAddress; + private Long VirtualASN; + private List DNS; + private MultipurposeSocketAddress TCPListen; + private MultipurposeSocketAddress UDPListen; + private String VirtualSocketName; + private ListLineTable=new ArrayList<>(); + private ListConnectLineTable=new ArrayList<>(); + + + + + public KLALBControllerConfigItem(String type, boolean nogui, String virtualAddress, Long virtualASN, + List dNS, MultipurposeSocketAddress tCPListen, MultipurposeSocketAddress uDPListen, + String virtualSocketName, List lineTable, + List connectLineTable) { + super(type); + this.nogui = nogui; + VirtualAddress = virtualAddress; + VirtualASN = virtualASN; + DNS = dNS; + TCPListen = tCPListen; + UDPListen = uDPListen; + VirtualSocketName = virtualSocketName; + LineTable = lineTable; + ConnectLineTable = connectLineTable; + } + + + + public void setLanguage(String language) { + this.language = language; + } + + + + public KLALBControllerConfigItem(String type) { + super(type); + } + + + + public String getLanguage() { + return language; + } + + + + public String getVirtualSocketName() { + return VirtualSocketName; + } + + + + public void setVirtualSocketName(String virtualSocketName) { + VirtualSocketName = virtualSocketName; + } + + + + public boolean isNogui() { + return nogui; + } + + + + public void setNogui(boolean nogui) { + this.nogui = nogui; + } + + + + public String getVirtualAddress() { + return VirtualAddress; + } + + + + public void setVirtualAddress(String virtualAddress) { + VirtualAddress = virtualAddress; + } + + + + public Long getVirtualASN() { + return VirtualASN; + } + + + + public void setVirtualASN(Long virtualASN) { + VirtualASN = virtualASN; + } + + + + public List getDNS() { + return DNS; + } + + + + public void setDNS(List dNS) { + DNS = dNS; + } + + + + public MultipurposeSocketAddress getTCPListen() { + return TCPListen; + } + + + + public void setTCPListen(MultipurposeSocketAddress tCPListen) { + TCPListen = tCPListen; + } + + + + public MultipurposeSocketAddress getUDPListen() { + return UDPListen; + } + + + + public void setUDPListen(MultipurposeSocketAddress uDPListen) { + UDPListen = uDPListen; + } + + + + public List getLineTable() { + return LineTable; + } + + + + public void setLineTable(List lineTable) { + LineTable = lineTable; + } + + + + public List getConnectLineTable() { + return ConnectLineTable; + } + + + + public void setConnectLineTable(List connectLineTable) { + ConnectLineTable = connectLineTable; + } + + + + @Override + public String toString() { + return "KLALBControllerConfigItem [language=" + language + ", nogui=" + nogui + ", VirtualAddress=" + + VirtualAddress + ", VirtualASN=" + VirtualASN + ", DNS=" + DNS + ", TCPListen=" + TCPListen + + ", UDPListen=" + UDPListen + ", VirtualSocketName=" + VirtualSocketName + ", LineTable=" + LineTable + + ", ConnectLineTable=" + ConnectLineTable + "]"; + } + + + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + Objects.hash(ConnectLineTable, DNS, LineTable, TCPListen, UDPListen, VirtualASN, + VirtualAddress, VirtualSocketName, language, nogui); + return result; + } + + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + KLALBControllerConfigItem other = (KLALBControllerConfigItem) obj; + return Objects.equals(ConnectLineTable, other.ConnectLineTable) && Objects.equals(DNS, other.DNS) + && Objects.equals(LineTable, other.LineTable) && Objects.equals(TCPListen, other.TCPListen) + && Objects.equals(UDPListen, other.UDPListen) && Objects.equals(VirtualASN, other.VirtualASN) + && Objects.equals(VirtualAddress, other.VirtualAddress) + && Objects.equals(VirtualSocketName, other.VirtualSocketName) + && Objects.equals(language, other.language) && nogui == other.nogui; + } + + + + +} diff --git a/src/org/kne/cloud/network/klalb/KLALBMain.java b/src/org/kne/cloud/network/klalb/KLALBMain.java index 8f610dc..d2f5d49 100644 --- a/src/org/kne/cloud/network/klalb/KLALBMain.java +++ b/src/org/kne/cloud/network/klalb/KLALBMain.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; import java.util.Scanner; import javax.swing.JFrame; @@ -18,6 +19,7 @@ import org.kne.cloud.network.SocketChannelListener; import org.kne.cloud.network.SocketListener; import org.kne.cloud.network.ipv6.RouteItem; import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; +import org.kne.cloud.network.klalb.ui.KLALBStateGUI3; import org.kne.cloud.network.klalb.ui.UIEnv; import org.kne.cloud.network.perf.Kperf; import org.kne.cloud.network.perf.MemcpyBenchmark; @@ -25,7 +27,7 @@ import org.kne.cloud.network.perf.NodeBenchmark; import org.kne.debug.Debuger; public class KLALBMain { - public static KLALBStateGUI2 ksg; + public static KLALBStateGUI3 ksg; public static void main(String[] args) throws IOException { try { UIEnv.inituie(); @@ -35,14 +37,15 @@ public class KLALBMain { System.out.println(CONST.klalb+" V"+CONST.klalbver); Scanner scn=new Scanner(System.in); - File configJson=new File("klalbconfig.json"); + File configJson=new File("klalb-config.json"); KLALBProxySystem kpcje=new KLALBProxySystem(); kpcje.loadConfigJson(configJson); System.out.println("SRv6地址:"+kpcje.getKlalbController().getSelf().getAddress().getHostAddress()); try { + if(!kpcje.getControllerConfig().isNogui()) openGUI(kpcje); - }catch(RuntimeException e) { + }catch(Throwable e) { e.printStackTrace(); } /*MultipurposeSocketAddress mpa=new MultipurposeSocketAddress("127.9.9.9", 49573); @@ -79,7 +82,11 @@ public class KLALBMain { break; case "monitor": + try { openGUI(kpcje); + }catch(Throwable e) { + e.printStackTrace(); + } break; case "lines-state": System.out.println("线路状态:"); @@ -191,6 +198,9 @@ public class KLALBMain { default: System.out.println("未知命令,请输入help以查询命令说明"); } + }catch (NoSuchElementException err) { + System.out.println("已退出程序"); + System.exit(0); }catch(RuntimeException e) { System.out.println("错误!"); e.printStackTrace(); diff --git a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java index 0db0fe4..c55d0b6 100644 --- a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java +++ b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java @@ -2,6 +2,7 @@ package org.kne.cloud.network.klalb; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.net.Inet6Address; @@ -23,10 +24,15 @@ import java.util.Map.Entry; import org.kne.cloud.network.*; import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; +import org.kne.cloud.network.klalb.ui.KLALBStateGUI3; +import org.kne.cloud.network.klalb.ui.Language; +import org.kne.cloud.network.klalb.ui.UIEnv; import org.kne.cloud.network.minecraft.MinecraftSocketBridge; import java.util.Set; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -37,6 +43,15 @@ public class KLALBProxySystem { private Set proxys=new HashSet<>(); private KLALBController klalbController; private KLALBRemoteManagement krm; + private KLALBConfig config; + private Gson gson; + private File jsonFile; + { + GsonBuilder gb=new GsonBuilder(); + MultipurposeSocketAddress.registerToGsonBuilder(gb); + KLALBConfigItem.registerToGsonBuilder(gb); + gson=gb.create(); + } public Set getProxys() { return proxys; } @@ -87,6 +102,7 @@ public class KLALBProxySystem { } public void loadConfigJson(File jsonFile) throws IOException { + this.jsonFile=jsonFile; FileReader fr = null; try { fr=new FileReader(jsonFile); @@ -104,229 +120,165 @@ public class KLALBProxySystem { loadConfigJson(new JsonParser().parse(json)); } public void loadConfigJson(JsonElement json) { - JsonArray jobj=(JsonArray) json; - jobj.forEach((val)->{ - solveEntry((JsonObject) val); - }); + KLALBConfig config= gson.fromJson(json, KLALBConfig.class); + System.out.println(config); + loadConfig(config); } - protected void solveEntry(JsonObject entry){ - switch (entry.get("Type").getAsString()) { - case "KLALBController": - JsonElement vase= entry.get("VirtualAddress"); - //System.out.println(vase); - Listdaddr=new ArrayList(); - JsonElement vdns= entry.get("DNS"); - if(vdns!=null) { - if(vdns instanceof JsonArray) { - JsonArray arr=(JsonArray) vdns; - for(JsonElement str:arr) { + public void loadConfig(KLALBConfig config) { + this.config=config; + for(KLALBConfigItem item:config) { + if(item instanceof KLALBControllerConfigItem) { + KLALBControllerConfigItem kcci=(KLALBControllerConfigItem) item; + String lstr=kcci.getLanguage(); + if(lstr!=null) { + Language lang=Language.valueOf(lstr); + if(lang!=null) { try { - daddr.add((Inet6Address) InetAddress.getByName(str.getAsString())); - } catch (UnknownHostException e) { + UIEnv.setRsb(lang.getFileName()); + } catch (IOException e) { e.printStackTrace(); } } + } + String vase= kcci.getVirtualAddress(); + //System.out.println(vase); + Listdaddr=new ArrayList(); + List vdns= kcci.getDNS(); + if(vdns!=null) { + for(InetAddress dnsaddr:vdns) { + daddr.add(dnsaddr); + } + + } + if(vase!=null) { + try { + klalbController=new KLALBController((Inet6Address) InetAddress.getByName(vase),daddr); + } catch (UnknownHostException e) { + e.printStackTrace(); + } }else { - try { - daddr.add((Inet6Address) InetAddress.getByName(vdns.getAsString())); - } catch (UnknownHostException e) { - e.printStackTrace(); - } + klalbController=new KLALBController(daddr); } - } - if(vase!=null) { - try { - klalbController=new KLALBController((Inet6Address) InetAddress.getByName(vase.getAsString()),daddr); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - }else { - klalbController=new KLALBController(daddr); - } - - JsonElement vasn= entry.get("VirtualASN"); - if(vasn!=null) { - klalbController.getIpv6Router().setASN (Long.parseLong( vasn.getAsString())); - } - - - JsonElement vsne=entry.get("VirtualSocketName"); - //if(vsne!=null) { - MultipurposeSocketAddress.getSocketTypeRegister().put(vsne.getAsString(), klalbController.getSocketType()); - //} - JsonElement tcple=entry.get("TCPListen"); - if(tcple!=null) { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(tcple.getAsString()); - SocketChannelListener tcpl = null; - try { - tcpl = new SocketChannelListener(mpsa); + Long vasn= kcci.getVirtualASN(); + if(vasn!=null) { + klalbController.getIpv6Router().setASN (vasn); + } - tcpl.setCon((soc)->{ - KLALBRemoteLine krs=null; - try { - krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc)); - klalbController.addRemoteLine(krs); - } catch (IOException e) { - e.printStackTrace(); - } + String vsne=kcci.getVirtualSocketName(); + //if(vsne!=null) { + MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getSocketType()); + //} + MultipurposeSocketAddress tcple=kcci.getTCPListen(); + if(tcple!=null) { - }); - MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(mpsa.getType(), mpsa.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort()); - klalbController.getListenSocketAddress().add(mpsa2); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - JsonElement udple=entry.get("UDPListen"); - if(udple!=null) { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(udple.getAsString()); - DatagramSocketListener udpl = null; - try { - udpl = new DatagramSocketListener(mpsa); - - udpl.setCon((soc)->{ - - KLALBRemoteLine krs=null; + SocketChannelListener tcpl = null; try { - krs = new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(soc)); - klalbController.addRemoteLine(krs); - } catch (IOException e) { - e.printStackTrace(); - } + tcpl = new SocketChannelListener(tcple); - }); - MultipurposeSocketAddress mpsau2=new MultipurposeSocketAddress(mpsa.getType(), mpsa.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort()); - //klalbController.getListenSocketAddress().add(mpsau2); - } catch (IOException e1) { - e1.printStackTrace(); + tcpl.setCon((soc)->{ + + KLALBRemoteLine krs=null; + try { + krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc)); + klalbController.addRemoteLine(krs); + } catch (IOException e) { + e.printStackTrace(); + } + + }); + MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(tcple.getType(), tcple.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort()); + klalbController.getListenSocketAddress().add(mpsa2); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + MultipurposeSocketAddress udple=kcci.getUDPListen(); + if(udple!=null) { + DatagramSocketListener udpl = null; + try { + udpl = new DatagramSocketListener(udple); + + udpl.setCon((soc)->{ + + KLALBRemoteLine krs=null; + try { + krs = new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(soc)); + klalbController.addRemoteLine(krs); + } catch (IOException e) { + e.printStackTrace(); + } + + }); + MultipurposeSocketAddress mpsau2=new MultipurposeSocketAddress(udple.getType(), udple.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort()); + //klalbController.getListenSocketAddress().add(mpsau2); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + List linele=kcci.getLineTable(); + if(linele!=null) { + linele.forEach((aline)->{ + klalbController.getSelflineTable().add(aline); + }); + + } + List linetoc=kcci.getConnectLineTable(); + if(linetoc!=null) { + linetoc.forEach((aline)->{ + klalbController.addRemoteLines(aline); + }); + } + }else if(item instanceof SocketBridgeConfigItem) { + SocketBridgeConfigItem scci=(SocketBridgeConfigItem) item; + try { + proxys.add(scci.createProxy(klalbController)); + } catch (IOException e) { + e.printStackTrace(); } } - JsonElement linele=entry.get("LineTable"); - if(linele!=null) { - JsonArray jary=(JsonArray)linele; - jary.forEach((aline)->{ - klalbController.getSelflineTable().add(new MultipurposeSocketAddress(aline.getAsString())); - }); - - } - JsonElement linetoc=entry.get("ConnectLineTable"); - if(linetoc!=null) { - JsonArray jary=(JsonArray)linetoc; - jary.forEach((aline)->{ - klalbController.addRemoteLines(new MultipurposeSocketAddress(aline.getAsString())); - }); - } - break; - case "SocketBridge": - - try { - proxys.add(createProxyByJson(entry)); - } catch (IOException e) { - e.printStackTrace(); - } - break; - default: - break; - } - } - public Proxy createProxyByJson(JsonObject entry) throws IOException { - HostPortMap mapp=new HostPortMap(); - LinkedHashMapmapb=new LinkedHashMap<>(); - MultipurposeSocketAddress l=new MultipurposeSocketAddress(entry.get("Listen").getAsString()); - SocketBridgeFactory bdg=getDefaultBridgeFactory(entry.get("Bridge"),mapb); - MultipurposeSocketAddress r=getDefaultConnect(entry.get("Connect"),mapp); - return new SocketToSocketProxy(l ,new MultipurposeSocketAddress("0.0.0.0:0"), r,mapp,bdg,mapb); - } - public JsonObject createJsonObjectByProxy(Proxy p) { - if(p instanceof SocketToSocketProxy) { - SocketToSocketProxy stsp=(SocketToSocketProxy) p; - JsonObject jobj=new JsonObject(); - jobj.addProperty("Listen", stsp.getListen().toString()); - jobj.add("Bridge", getJsonElementByBridges(stsp)); - jobj.add("Connect", getJsonElementByConnects(stsp)); - return jobj; - }else { - throw new UnsupportedOperationException(); } } - private JsonElement getJsonElementByConnects(SocketToSocketProxy stsp) { - if(stsp.getDetectedConnect()==null||stsp.getDetectedConnect().isEmpty()) { - return new JsonPrimitive(stsp.getDefaultConnect().toString()); - }else { - JsonObject jo=new JsonObject(); - for (Iterator> iterator = stsp.getDetectedConnect().entrySet().iterator(); iterator.hasNext();) { - Entry proxy = (Entry) iterator.next(); - if(!proxy.getKey().equals("DEFAULT")) { - jo.addProperty(proxy.getKey(), proxy.getValue().toString()); - } - } - jo.addProperty("DEFAULT", stsp.getDefaultConnect().toString()); - return jo; - } - } - private JsonElement getJsonElementByBridges(SocketToSocketProxy stsp) { - if(stsp.getDetectedFactory()==null||stsp.getDetectedFactory().isEmpty()) { - return new JsonPrimitive(getJobjByFActory(stsp.getDefaultFactory())); - }else { - JsonObject jo=new JsonObject(); - for (Iterator> iterator = stsp.getDetectedFactory().entrySet().iterator(); iterator.hasNext();) { - Entry proxy = (Entry) iterator.next(); - if(!proxy.getKey().equals("DEFAULT")) { - jo.addProperty(proxy.getKey(), getJobjByFActory(proxy.getValue())); - } - } - jo.addProperty("DEFAULT",getJobjByFActory( stsp.getDefaultFactory())); - return jo; - } - } - private MultipurposeSocketAddress getDefaultConnect(JsonElement jsonElement, LinkedHashMap mapp) { - if(jsonElement instanceof JsonObject) { - JsonObject jobj=(JsonObject) jsonElement; - jobj.entrySet().forEach((en)->{ - mapp.put(en.getKey(), new MultipurposeSocketAddress( en.getValue().getAsString())); - }); - return mapp.get("DEFAULT"); - }else { - return new MultipurposeSocketAddress(jsonElement.getAsString()); - } - } - private SocketBridgeFactory getDefaultBridgeFactory(JsonElement jsonElement, LinkedHashMap mapp) { - if(jsonElement instanceof JsonObject) { - JsonObject jobj=(JsonObject) jsonElement; - jobj.entrySet().forEach((en)->{ - mapp.put(en.getKey(), getFactoryByJobj(en.getValue().getAsString())); - }); - return mapp.get("DEFAULT"); - }else { - return getFactoryByJobj(jsonElement.getAsString()); - } - } - private SocketBridgeFactory getFactoryByJobj(String string) { - if(string.startsWith("SocketBridge")) { - return new DefaultSocketBridgeFactory(); - }else if(string.startsWith("MinecraftSocketBridge")) { - return new DefaultMinecraftSocketBridgeFactory(klalbController.getSelf().getAddress(), Integer.parseInt(string.substring(21))); + private KLALBStateGUI3 kgui; + public KLALBStateGUI3 getKLALBGUI() { + if(kgui==null) { + kgui=new KLALBStateGUI3(klalbController); + kgui.loadConfig(config); + kgui.setSaveComsumer((cfg)->{ + String json=gson.toJson(cfg); + if(jsonFile!=null) { + FileWriter fw = null; + try { + fw=new FileWriter(jsonFile); + fw.write(json); + }catch(IOException e) { + e.printStackTrace(); + }finally { + if(fw!=null) + try { + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + }); } - throw new IllegalArgumentException("unknown SocketBridge type:"+string); - } - private String getJobjByFActory(SocketBridgeFactory sbf) { - if(sbf instanceof DefaultSocketBridgeFactory) { - return "SocketBridge"; - }else if(sbf instanceof DefaultMinecraftSocketBridgeFactory) { - return "MinecraftSocketBridge"+((DefaultMinecraftSocketBridgeFactory)sbf).getVport(); - }else { - throw new UnsupportedOperationException(); - } - } - private KLALBStateGUI2 kgui; - public KLALBStateGUI2 getKLALBGUI() { - if(kgui==null) - kgui=new KLALBStateGUI2(klalbController); return kgui; } + public KLALBConfig getConfig() { + return config; + } + public KLALBControllerConfigItem getControllerConfig() { + for(KLALBConfigItem item:config) { + if(item instanceof KLALBControllerConfigItem) + return (KLALBControllerConfigItem) item; + } + return null; + } } diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java b/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java index 954f83b..5bf9f1a 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java @@ -369,7 +369,8 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable sendMap= new ConcurrentHashMap<>(); + private Map sendMap= new ConcurrentHashMap<>(1024,0.2f); private AtomicInteger sendmapWindowUsed=new AtomicInteger(0); - private MaprecvedUIDMap=new ConcurrentHashMap(); + private MaprecvedUIDMap=new ConcurrentHashMap(1024,0.2f); private volatile int inputchachesize = 8192 * 4000; private volatile int outputchachesize = 8192 * 240;//500 diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java index 483dc0a..6a4e2b9 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java @@ -144,7 +144,7 @@ public class KLALBRemoteManagement { case "OPENMONITORUI": klalbProxySystem.getKLALBGUI().setVisible(true); break; - case "GETSOCKETBRIDGE": + /*case "GETSOCKETBRIDGE": JsonArray bridges=new JsonArray(); Set pxy=klalbProxySystem.getProxys(); synchronized (pxy) { @@ -165,7 +165,7 @@ public class KLALBRemoteManagement { e.printStackTrace(); } } - break; + break;*/ default: System.out.println("未知请求类型:"+reqt); break; diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java index 84965a7..e01ccbc 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java @@ -94,9 +94,9 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl //60000 30 30 - private final int MTU=10000; + private final int MTU=60000; private final long MIN_RTTVAR=100000000L; - private final long MIN_LIMIT_SPEED=128*1024L; + private final long MIN_LIMIT_SPEED=64*1024L; private final long REACK_INTERVAL = 100000000L; @@ -115,12 +115,12 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl private ReentrantLock backlogQueuelock=new ReentrantLock(); private ThreadParker sendDequeLock=new ThreadParker(); - private Map recvMap = new ConcurrentHashMap(100000); + private Map recvMap = new ConcurrentHashMap(1024,0.2f); private AtomicInteger recvWindowUsed=new AtomicInteger(0); //private AtomicInteger recvCounter=new AtomicInteger(0); - private Map sendmap=new ConcurrentHashMap(100000); + private Map sendmap=new ConcurrentHashMap(1024,0.5f); private AtomicInteger sendmapWindowUsed=new AtomicInteger(0); //private ReentrantReadWriteLock sendmaplock=new ReentrantReadWriteLock(); diff --git a/src/org/kne/cloud/network/klalb/PortBinder.java b/src/org/kne/cloud/network/klalb/PortBinder.java index 8f85c1e..faf7d20 100644 --- a/src/org/kne/cloud/network/klalb/PortBinder.java +++ b/src/org/kne/cloud/network/klalb/PortBinder.java @@ -34,11 +34,11 @@ public class PortBinder { this.controller = controller; } private ReentrantReadWriteLock bindMaplock=new ReentrantReadWriteLock(); - private MapbindMap=new ConcurrentHashMap<>(65536*16); + private MapbindMap=new ConcurrentHashMap<>(1024,0.2f); private ReentrantReadWriteLock listenMaplock=new ReentrantReadWriteLock(); - private MaplistenMap=new ConcurrentHashMap<>(65536*16); + private MaplistenMap=new ConcurrentHashMap<>(1024,0.2f); private ReentrantReadWriteLock connectMaplock=new ReentrantReadWriteLock(); - private Map,BindableKLALBPacketConsumer>connectMap=new ConcurrentHashMap<>(65536*16); + private Map,BindableKLALBPacketConsumer>connectMap=new ConcurrentHashMap<>(1024,0.2f); private volatile int portn=65535; public void bind(BindableKLALBPacketConsumer ks) throws BindException { bindMaplock.writeLock().lock(); diff --git a/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java b/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java new file mode 100644 index 0000000..def9980 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java @@ -0,0 +1,112 @@ +package org.kne.cloud.network.klalb; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.channels.MulticastChannel; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.kne.cloud.network.DefaultMinecraftSocketBridgeFactory; +import org.kne.cloud.network.DefaultSocketBridgeFactory; +import org.kne.cloud.network.HostPortMap; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.Proxy; +import org.kne.cloud.network.SocketBridgeFactory; +import org.kne.cloud.network.SocketToSocketProxy; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +public class SocketBridgeConfigItem extends KLALBConfigItem { + private MultipurposeSocketAddress Listen; + + private LinkedHashMapBridge=new LinkedHashMap<>(); + private HostPortMap Connect=new HostPortMap(); + + public SocketBridgeConfigItem( MultipurposeSocketAddress listen, + LinkedHashMap bridge, HostPortMap connect) { + super("SocketBridge"); + Listen = listen; + Bridge = bridge; + Connect = connect; + } + + + @Override + public String toString() { + return "SocketBridgeConfigItem [Listen=" + Listen + ", Bridge=" + Bridge + ", Connect=" + Connect + "]"; + } + + + /*public static JsonDeserializer getSocketBridgeConfigItemJsonDeserializer(){ + return new JsonDeserializer() { + + @Override + public SocketBridgeConfigItem deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) + throws JsonParseException { + if(arg0.isJsonObject()) { + HostPortMap mapp=new HostPortMap(); + LinkedHashMapmapb=new LinkedHashMap<>(); + MultipurposeSocketAddress l=new MultipurposeSocketAddress(((JsonObject) arg0).get("Listen").getAsString()); + SocketBridgeFactory bdg=getDefaultBridgeFactory(((JsonObject)arg0).get("Bridge"),mapb); + MultipurposeSocketAddress r=getDefaultConnect(((JsonObject)arg0).get("Connect"),mapp); + return new SocketBridgeConfigItem(l,mapb,mapp); + }else { + throw new JsonParseException("not a object:"+arg0); + } + } + }; + } + public static JsonSerializer getSocketBridgeConfigItemJsonSerializer(){ + return new JsonSerializer() { + + @Override + public JsonElement serialize(SocketBridgeConfigItem arg0, Type arg1, JsonSerializationContext arg2) { + return null; + + } + }; + } + public static void registerToGsonBuilder(GsonBuilder gsonBuilder) { + gsonBuilder.registerTypeAdapter(SocketBridgeConfigItem.class, getSocketBridgeConfigItemJsonDeserializer()); + gsonBuilder.registerTypeAdapter(SocketBridgeConfigItem.class, getSocketBridgeConfigItemJsonSerializer()); + }*/ + public Proxy createProxy(KLALBController controller) throws IOException { + HostPortMap mapp=new HostPortMap(); + LinkedHashMapmapb=new LinkedHashMap<>(); + MultipurposeSocketAddress l=Listen; + SocketBridgeFactory bdg=getDefaultBridgeFactory(Bridge,mapb,controller); + MultipurposeSocketAddress r=getDefaultConnect(Connect,mapp); + return new SocketToSocketProxy(l ,new MultipurposeSocketAddress("0.0.0.0:0"), r,mapp,bdg,mapb); + } + private MultipurposeSocketAddress getDefaultConnect(HostPortMap connect2, LinkedHashMap mapp) { + connect2.entrySet().forEach((en)->{ + mapp.put(en.getKey(), en.getValue()); + }); + return mapp.get("DEFAULT"); + } + private SocketBridgeFactory getDefaultBridgeFactory(LinkedHashMap bridge2, LinkedHashMap mapp, KLALBController controller) { + bridge2.entrySet().forEach((en)->{ + mapp.put(en.getKey(), getFactoryByJobj(en.getValue(), controller)); + }); + return mapp.get("DEFAULT"); + }private SocketBridgeFactory getFactoryByJobj(String string,KLALBController controller) { + if(string.startsWith("SocketBridge")) { + return new DefaultSocketBridgeFactory(); + }else if(string.startsWith("MinecraftSocketBridge")) { + return new DefaultMinecraftSocketBridgeFactory(controller.getSelf().getAddress(), Integer.parseInt(string.substring(21))); + } + throw new IllegalArgumentException("unknown SocketBridge type:"+string); + } +} diff --git a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java index 8cdde11..138e5d7 100644 --- a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java @@ -61,7 +61,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem } private SocketChannel connectSocket; - private int sotimeout; + private int sotimeout=getDefaultSoTimeout(); public StreamChannelKLALBPacketLink(SocketChannel connectSocket) throws IOException { this.connectSocket=connectSocket; connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true); @@ -140,10 +140,15 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem } - - + private ByteBuffer[] bbfwx=new ByteBuffer[100<<1]; + { + for(int i=0;i<100;i++) { + bbfwx[i<<1]=NetworkPacket.bufferAllocator.allocate(4); + } + } @Override public void writePackets(ByteBuffer[] kpp,int off,int len) throws IOException { + if(len>100) { ByteBuffer[] bbfw=new ByteBuffer[len<<1]; for(int i=0;ilength) { - Vector2 dicb=sub.normalize().multi((distance-length)/3); + Vector2 dicb=sub.normalize().multi((distance-length)/4); Vector2 dica=dicb.opposite(); na.delta=na.delta.add(dica); nb.delta=nb.delta.add(dicb); @@ -497,15 +544,15 @@ public class GraphPanel extends JPanel { private Random r=new Random(); public Vector2 getRandomPos() { double x,y; - if(xmin>=xmax) { - x=r.nextDouble(); - }else { + if(xmin=ymax) { - y=r.nextDouble(); }else { + x=r.nextDouble(); + } + if(ymin saveComsumer; + + private JComboBox comboLang; + + + public Consumer getSaveComsumer() { + return saveComsumer; + } + + public void setSaveComsumer(Consumer saveComsumer) { + this.saveComsumer = saveComsumer; + } + + /** + * @wbp.parser.constructor + */ + public KLALBStateGUI3(KLALBController kpcje) { + this(kpcje, CONST.klalb + " "+UIEnv.getRsb().getString("srv6acc")+" V" + CONST.klalbver); + } + + public KLALBStateGUI3(KLALBController kc, String title) { + + // setResizable(false); + setIconImage(UIEnv.getIcon()); + // setTitleColor(new Color(255, 255, 255, 250)); + setTitleColor(UIEnv.getDefaultTitleColor()); + getContentPane().setBackground(UIEnv.getDefaultBackgroundColor()); + getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f)); + getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY)); + getTitlelabel().setForeground(Color.WHITE); + // getContentPane().setBackground(new Color(0,0,0,0)); + /* + * setTitleColor(new Color(0,0,0,80)); getContentPane().setBackground(new + * Color(0,0,0,80)); getTitlelabel().setForeground(Color.WHITE); + */ + + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + getContentPane().add(tabbedPane, BorderLayout.CENTER); + + JPanel panel_3 = new JPanel(); + panel_3.setBackground(new Color(255, 255, 255)); + tabbedPane.addTab(UIEnv.getRsb().getString("networkgraph"), null, panel_3, null); + panel_3.setLayout(new BorderLayout(0, 0)); + + JPanel panel_4 = new JPanel(); + panel_3.add(panel_4, BorderLayout.NORTH); + panel_4.setLayout(new BorderLayout(0, 0)); + + textFieldLocate = new JTextField(); + panel_4.add(textFieldLocate, BorderLayout.CENTER); + textFieldLocate.setColumns(10); + + graph = new NetworkGraphPanel(kc.getIpv6Router().getKlalbRouteProtol()); + graph.setOpaque(false); + JScrollPane jsp = new JScrollPane(); + jsp.setWheelScrollingEnabled(false); + jsp.setViewportView(graph); + + graph.addMouseWheelListener(new MouseWheelListener() { + private double scaleidx = 1; + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + int val = e.getWheelRotation(); + double scaleidxold = scaleidx; + scaleidx *= Math.pow(1.1, val); + if (scaleidx > 5) { + scaleidx = 5; + } + if (scaleidx < 0.1) { + scaleidx = 0.1; + } + double pow = scaleidx / scaleidxold; + Point pos = jsp.getViewport().getViewPosition(); + double canvasX = e.getX(); + double canvasY = e.getY(); + double w = graph.getWidth(); + double h = graph.getHeight(); + double percentX = canvasX / w; + double percentY = canvasY / h; + graph.setScale(scaleidx); + graph.updateBounds(); + double newcanvasX = percentX * w * pow; + double newcanvasY = percentY * h * pow; + double dx = newcanvasX - canvasX; + double dy = newcanvasY - canvasY; + // System.out.println(dx+" "+dy); + pos.x += dx; + pos.y += dy; + jsp.getViewport().setViewPosition(pos); + } + }); + + JButton btnLocate = new JButton(UIEnv.getRsb().getString("find")); + btnLocate.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String text = textFieldLocate.getText(); + try { + Inet6Address addr = (Inet6Address) Inet6Address.getByName(text); + GraphNode node = graph.getNodes().get(addr); + if (node == null) { + JOptionPane.showMessageDialog(KLALBStateGUI3.this, "Address not found", "Warning", + JOptionPane.WARNING_MESSAGE); + } else { + Point pos = new Point(); + graph.updateBounds(); + Dimension dim = jsp.getViewport().getExtentSize(); + // System.out.println(dim); + pos.x = (int) ((node.getX() + graph.getTranslateX()) * graph.getScale() - dim.width / 2); + pos.y = (int) ((node.getY() + graph.getTranslateY()) * graph.getScale() - dim.height / 2); + jsp.getViewport().setViewPosition(pos); + } + } catch (UnknownHostException e1) { + JOptionPane.showMessageDialog(KLALBStateGUI3.this, "Input format error", "Error", + JOptionPane.ERROR_MESSAGE); + e1.printStackTrace(); + } + } + }); + panel_4.add(btnLocate, BorderLayout.EAST); + + JButton btnHome = new JButton(UIEnv.getRsb().getString("home")); + btnHome.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + textFieldLocate.setText(addressField.getText()); + btnLocate.doClick(); + } + }); + panel_4.add(btnHome, BorderLayout.WEST); + panel_3.add(jsp, BorderLayout.CENTER); + + JPanel panel_4_1 = new JPanel(); + panel_3.add(panel_4_1, BorderLayout.SOUTH); + panel_4_1.setLayout(new BorderLayout(0, 0)); + textFieldLocate.addKeyListener(new KeyListener() { + + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyPressed(KeyEvent e) { + // TODO 自动生成的方法存根 + + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + btnLocate.doClick(); + } + } + }); + JPanel dashs = new JPanel(); + dashs.setOpaque(false); + // dashboard.add(dashs); + panel_4_1.add(dashs, BorderLayout.EAST); + { + upSpeed = new DefaultValueDataset(0); + upDataSpeed = new DefaultValueDataset(0); + DialPlot dpup = new DialPlot(); + dpup.setDataset(1, upSpeed); + dpup.setDataset(0, upDataSpeed); + StandardDialFrame sdfs = new StandardDialFrame(); + sdfs.setVisible(false); + dpup.setDialFrame(sdfs); + StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds.setTickRadius(0.9); + sds.setTickLabelsVisible(false); + dpup.addScale(0, sds); + + StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); + sdrr.setInnerRadius(0.92); + sdrr.setOuterRadius(0.93); + dpup.addLayer(sdrr); + + StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr2.setInnerRadius(0.92); + sdrr2.setOuterRadius(0.93); + dpup.addLayer(sdrr2); + + StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); + sdrr3.setInnerRadius(0.92); + sdrr3.setOuterRadius(0.93); + dpup.addLayer(sdrr3); + + DialPointer.Pointer dpd = new DialPointer.Pointer(); + dpd.setRadius(0.8); + dpd.setFillPaint(new Color(127, 0, 0, 0)); + dpd.setOutlinePaint(new Color(127, 0, 0)); + dpd.setDatasetIndex(0); + dpup.addLayer(dpd); + + DialPointer.Pointer dp = new DialPointer.Pointer(); + dp.setRadius(0.8); + dp.setFillPaint(Color.RED); + dp.setOutlinePaint(Color.RED); + dp.setDatasetIndex(1); + dpup.addLayer(dp); + + upSpeedText = new DialTextAnnotation("0%"); + upSpeedText.setFont(UIEnv.getFont().deriveFont(18.0f)); + dpup.addLayer(upSpeedText); + + JFreeChart jfup = new JFreeChart(dpup); + jfup.setBorderPaint(Color.WHITE); + jfup.setTitle(UIEnv.getRsb().getString("uploadspeed")); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup.setView(0, 0, 1, 1); + ChartPanel cpup = new ChartPanel(jfup); + cpup.setPreferredSize(dashSize); + cpup.setSize(cpup.getPreferredSize()); + cpup.setBackground(Color.WHITE); + cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); + dashs.add(cpup); + + downSpeed = new DefaultValueDataset(0); + downDataSpeed = new DefaultValueDataset(0); + DialPlot dpup1 = new DialPlot(); + dpup1.setDataset(1, downSpeed); + dpup1.setDataset(0, downDataSpeed); + StandardDialFrame sdfs1 = new StandardDialFrame(); + sdfs1.setVisible(false); + dpup1.setDialFrame(sdfs1); + StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds1.setTickRadius(0.9); + sds1.setTickLabelsVisible(false); + dpup1.addScale(0, sds1); + + StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); + sdrr1.setInnerRadius(0.92); + sdrr1.setOuterRadius(0.93); + dpup1.addLayer(sdrr1); + + StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr21.setInnerRadius(0.92); + sdrr21.setOuterRadius(0.93); + dpup1.addLayer(sdrr21); + + StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); + sdrr31.setInnerRadius(0.92); + sdrr31.setOuterRadius(0.93); + dpup1.addLayer(sdrr31); + + DialPointer.Pointer dp11 = new DialPointer.Pointer(); + dp11.setRadius(0.8); + dp11.setFillPaint(new Color(0, 127, 0, 0)); + dp11.setOutlinePaint(new Color(0, 127, 0)); + dp11.setDatasetIndex(0); + dpup1.addLayer(dp11); + + DialPointer.Pointer dp1 = new DialPointer.Pointer(); + dp1.setRadius(0.8); + dp1.setFillPaint(Color.GREEN); + dp1.setOutlinePaint(Color.GREEN); + dp1.setDatasetIndex(1); + dpup1.addLayer(dp1); + + downSpeedText = new DialTextAnnotation("0%"); + downSpeedText.setFont(UIEnv.getFont().deriveFont(18.0f)); + dpup1.addLayer(downSpeedText); + + JFreeChart jfup1 = new JFreeChart(dpup1); + jfup1.setBorderPaint(Color.WHITE); + jfup1.setTitle(UIEnv.getRsb().getString("downloadspeed")); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup1.setView(0, 0, 1, 1); + ChartPanel cpup1 = new ChartPanel(jfup1); + cpup1.setPreferredSize(dashSize); + cpup1.setSize(cpup1.getPreferredSize()); + cpup1.setBackground(Color.WHITE); + cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); + dashs.add(cpup1); + + } + + { + upPPS = new DefaultValueDataset(0); + upDataPPS = new DefaultValueDataset(0); + DialPlot dpup = new DialPlot(); + dpup.setDataset(1, upPPS); + dpup.setDataset(0, upDataPPS); + StandardDialFrame sdfs = new StandardDialFrame(); + sdfs.setVisible(false); + dpup.setDialFrame(sdfs); + StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds.setTickRadius(0.9); + sds.setTickLabelsVisible(false); + dpup.addScale(0, sds); + + StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); + sdrr.setInnerRadius(0.92); + sdrr.setOuterRadius(0.93); + dpup.addLayer(sdrr); + + StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr2.setInnerRadius(0.92); + sdrr2.setOuterRadius(0.93); + dpup.addLayer(sdrr2); + + StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); + sdrr3.setInnerRadius(0.92); + sdrr3.setOuterRadius(0.93); + dpup.addLayer(sdrr3); + + DialPointer.Pointer dp1 = new DialPointer.Pointer(); + dp1.setRadius(0.8); + dp1.setFillPaint(new Color(127, 0, 0, 0)); + dp1.setOutlinePaint(new Color(127, 0, 0)); + dp1.setDatasetIndex(0); + dpup.addLayer(dp1); + + DialPointer.Pointer dp = new DialPointer.Pointer(); + dp.setRadius(0.8); + dp.setFillPaint(Color.RED); + dp.setOutlinePaint(Color.RED); + dp.setDatasetIndex(1); + dpup.addLayer(dp); + + upPPSText = new DialTextAnnotation("0PPS"); + upPPSText.setFont(UIEnv.getFont().deriveFont(18.0f)); + dpup.addLayer(upPPSText); + + JFreeChart jfup = new JFreeChart(dpup); + jfup.setBorderPaint(Color.WHITE); + jfup.setTitle(UIEnv.getRsb().getString("uploadpps")); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup.setView(0, 0, 1, 1); + ChartPanel cpup = new ChartPanel(jfup); + cpup.setPreferredSize(dashSize); + cpup.setSize(cpup.getPreferredSize()); + cpup.setBackground(Color.WHITE); + cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); + dashs.add(cpup); + + downPPS = new DefaultValueDataset(0); + downDataPPS = new DefaultValueDataset(0); + DialPlot dpup1 = new DialPlot(); + dpup1.setDataset(1, downPPS); + dpup1.setDataset(0, downDataPPS); + StandardDialFrame sdfs1 = new StandardDialFrame(); + sdfs1.setVisible(false); + dpup1.setDialFrame(sdfs1); + StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds1.setTickRadius(0.9); + sds1.setTickLabelsVisible(false); + dpup1.addScale(0, sds1); + + StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); + sdrr1.setInnerRadius(0.92); + sdrr1.setOuterRadius(0.93); + dpup1.addLayer(sdrr1); + + StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr21.setInnerRadius(0.92); + sdrr21.setOuterRadius(0.93); + dpup1.addLayer(sdrr21); + + StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); + sdrr31.setInnerRadius(0.92); + sdrr31.setOuterRadius(0.93); + dpup1.addLayer(sdrr31); + + DialPointer.Pointer dp111 = new DialPointer.Pointer(); + dp111.setRadius(0.8); + dp111.setFillPaint(new Color(0, 127, 0, 0)); + dp111.setOutlinePaint(new Color(0, 127, 0)); + dp111.setDatasetIndex(0); + dpup1.addLayer(dp111); + DialPointer.Pointer dp11 = new DialPointer.Pointer(); + dp11.setRadius(0.8); + dp11.setFillPaint(Color.GREEN); + dp11.setOutlinePaint(Color.GREEN); + dp11.setDatasetIndex(1); + dpup1.addLayer(dp11); + + downPPSText = new DialTextAnnotation("0PPS"); + downPPSText.setFont(UIEnv.getFont().deriveFont(18.0f)); + dpup1.addLayer(downPPSText); + + JFreeChart jfup1 = new JFreeChart(dpup1); + jfup1.setBorderPaint(Color.WHITE); + jfup1.setTitle(UIEnv.getRsb().getString("downloadpps")); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup1.setView(0, 0, 1, 1); + ChartPanel cpup1 = new ChartPanel(jfup1); + cpup1.setPreferredSize(dashSize); + cpup1.setSize(cpup1.getPreferredSize()); + cpup1.setBackground(Color.WHITE); + cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); + dashs.add(cpup1); + } + JPanel panelp = new JPanel(); + panelp.setOpaque(false); + JPanel panel = new JPanel(); + panel.setOpaque(false); + panel.setBorder(new LineBorder(Color.GRAY)); + panel_4_1.add(panelp, BorderLayout.CENTER); + panelp.setLayout(new GridLayout(3, 1, 0, 0)); + + JPanel panel_2x = new JPanel(); + panel_2x.setOpaque(false); + + JPanel panel_2 = new JPanel(); + panel_2.setOpaque(false); + panelp.add(panel_2x); + panel_2x.setLayout(new BorderLayout(0, 0)); + + JPanel panel_2x_1 = new JPanel(); + panel_2x_1.setOpaque(false); + panelp.add(panel_2x_1); + panel_2x_1.setLayout(new BorderLayout(0, 0)); + + JLabel lblNewLabel_1 = new JLabel(UIEnv.getRsb().getString("asnumber")); + lblNewLabel_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); + panel_2x_1.add(lblNewLabel_1, BorderLayout.WEST); + + asnField2 = new JTextField(); + asnField2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); + asnField2.setHorizontalAlignment(SwingConstants.CENTER); + asnField2.setEditable(false); + panel_2x_1.add(asnField2, BorderLayout.CENTER); + asnField2.setColumns(10); + + JButton btnNewButton_2 = new JButton(UIEnv.getRsb().getString("copy")); + btnNewButton_2.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(asnField2.getText()), + null); + } + }); + panel_2x_1.add(btnNewButton_2, BorderLayout.EAST); + + JLabel lblNewLabel = new JLabel(UIEnv.getRsb().getString("ipv6addr")); + lblNewLabel.setFont(UIEnv.getFont().deriveFont(20.0f)); + lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); + panel_2x.add(lblNewLabel, BorderLayout.WEST); + panel_2x.add(panel_2); + panel_2.setLayout(new BorderLayout(0, 0)); + + addressField = new JTextField(); + addressField.setEditable(false); + addressField.setHorizontalAlignment(SwingConstants.CENTER); + addressField.setOpaque(false); + panel_2.add(addressField); + addressField.setColumns(10); + addressField.setFont(UIEnv.getFont().deriveFont(20.0f)); + + JButton btnNewButton_1 = new JButton(UIEnv.getRsb().getString("copy")); + btnNewButton_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(addressField.getText()), null); + } + }); + panel_2.add(btnNewButton_1, BorderLayout.EAST); + + panelp.add(panel); + panel.setLayout(new BorderLayout(0, 0)); + + JLabel jlb = new JLabel(UIEnv.getRsb().getString("onlinedevices")); + jlb.setHorizontalAlignment(SwingConstants.CENTER); + jlb.setFont(UIEnv.getFont().deriveFont(20.0f)); + panel.add(jlb, BorderLayout.WEST); + + devicesOnline = new JTextField(); + devicesOnline.setOpaque(false); + devicesOnline.setHorizontalAlignment(SwingConstants.CENTER); + devicesOnline.setFont(UIEnv.getFont().deriveFont(20.0f)); + devicesOnline.setEditable(false); + panel.add(devicesOnline); + devicesOnline.setColumns(10); + + JPanel linesPanel = new JPanel(); + linesPanel.setOpaque(false); + tabbedPane.add(linesPanel); + tabbedPane.setTitleAt(1,UIEnv.getRsb().getString("remotelines")); + linesPanel.setLayout(new BorderLayout()); + + ysp = new YScrollPane(730); + ysp.setOpaque(false); + JPanel wv = ysp.getView(); + linesPanel.add(ysp, BorderLayout.CENTER); + JMenuBar menuBar = new JMenuBar(); + getContentPane().add(menuBar, BorderLayout.NORTH); + + JMenu mnNewMenu = new JMenu(UIEnv.getRsb().getString("monitor")); + menuBar.add(mnNewMenu); + /* + * JMenu mnNewMenu_1 = new JMenu("Update frequency"); + * mnNewMenu.add(mnNewMenu_1); ButtonGroup bg=new ButtonGroup(); + * JRadioButtonMenuItem rdbtnmntmNewRadioItem = new + * JRadioButtonMenuItem("0.5s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem); + * bg.add(rdbtnmntmNewRadioItem); rdbtnmntmNewRadioItem.addActionListener(new + * ActionListener() { + * + * @Override public void actionPerformed(ActionEvent e) { rate=500; + * + * createRefreshTask(kc, ysp); } }); + * + * JRadioButtonMenuItem rdbtnmntmNewRadioItem_1 = new + * JRadioButtonMenuItem("0.2s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_1); + * bg.add(rdbtnmntmNewRadioItem_1); rdbtnmntmNewRadioItem_1.setSelected(true); + * rdbtnmntmNewRadioItem_1.addActionListener(new ActionListener() { + * + * + * @Override public void actionPerformed(ActionEvent e) { rate=200; + * + * createRefreshTask(kc, ysp); } }); + * + * JRadioButtonMenuItem rdbtnmntmNewRadioItem_2 = new + * JRadioButtonMenuItem("0.1s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_2); + * bg.add(rdbtnmntmNewRadioItem_2); + * + * rdbtnmntmNewRadioItem_2.addActionListener(new ActionListener() { + * + * @Override public void actionPerformed(ActionEvent e) { rate=100; + * + * createRefreshTask(kc, ysp); } }); + * + * JRadioButtonMenuItem rdbtnmntmNewRadioItem_21 = new + * JRadioButtonMenuItem("0.05s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_21); + * bg.add(rdbtnmntmNewRadioItem_21); + * rdbtnmntmNewRadioItem_21.addActionListener(new ActionListener() { + * + * @Override public void actionPerformed(ActionEvent e) { rate=50; + * + * createRefreshTask(kc, ysp); } }); + */ + + showoffline = new JCheckBoxMenuItem(UIEnv.getRsb().getString("showofflines")); + mnNewMenu.add(showoffline); + /* + * JProgressBar progressBar = new JProgressBar(); + * progressBar.setIndeterminate(true); progressBar.setForeground(Color.YELLOW); + * progressBar.setBorder(null); progressBar.setPreferredSize(new Dimension(100, + * 4)); ysp.add(progressBar, BorderLayout.NORTH); + */ + wv.addComponentListener(new ComponentListener() { + + @Override + public void componentShown(ComponentEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void componentResized(ComponentEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void componentMoved(ComponentEvent e) { + repaint(); + } + + @Override + public void componentHidden(ComponentEvent e) { + // TODO 自动生成的方法存根 + + } + }); + setTitle(title); + setSize(1200, 780); + setLocationRelativeTo(null); + + // setVisible(true); + if (SystemTray.isSupported()) { + st = SystemTray.getSystemTray(); + ti = new TrayIcon(UIEnv.getIcon()); + ti.setImageAutoSize(true); + PopupMenu jpm = new PopupMenu(); + MenuItem mix = new MenuItem("open"); + mix.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + setVisible(true); + } + }); + jpm.add(mix); + MenuItem mi = new MenuItem("exit"); + mi.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + close(); + } + }); + jpm.add(mi); + ti.setPopupMenu(jpm); + try { + st.add(ti); + } catch (AWTException e1) { + e1.printStackTrace(); + } + ti.addActionListener((x) -> { + setVisible(true); + }); + } + + // repaint(); + + t3 = new Timer("监视器刷新线程", true); + t2 = new Timer("仪表盘刷新线程", true); + t = new Timer("状态刷新线程", true); + createRefreshTask(kc, ysp); + + JPanel panel_1 = new JPanel(); + panel_1.setOpaque(false); + linesPanel.add(panel_1, BorderLayout.NORTH); + panel_1.setLayout(new BorderLayout(0, 0)); + + textField = new JTextField(); + panel_1.add(textField); + textField.setColumns(10); + textField.setToolTipText(UIEnv.getRsb().getString("lineaddressport")); + + JButton btnNewButton = new JButton(UIEnv.getRsb().getString("addline")); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + kc.addRemoteLines(new MultipurposeSocketAddress(textField.getText())); + } catch (RuntimeException ex) { + JOptionPane.showMessageDialog(KLALBStateGUI3.this, "Input format error", "Error", + JOptionPane.ERROR_MESSAGE); + ex.printStackTrace(); + } + } + }); + panel_1.add(btnNewButton, BorderLayout.EAST); + + JButton btnReconnect = new JButton(UIEnv.getRsb().getString("reconnectall")); + btnReconnect.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + kc.reconnectImmediately(); + } + }); + panel_1.add(btnReconnect, BorderLayout.WEST); + MouseAdapter ma = new MouseAdapter() { + + private Point origin; + + @Override + public void mousePressed(MouseEvent e) { + origin = new Point(e.getPoint()); + // System.out.println(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + if (origin != null) { + // System.out.println(e); + // JViewport viewPort = (JViewport) + // SwingUtilities.getAncestorOfClass(JViewport.class, jsp); + // if (viewPort != null) { + int deltaX = origin.x - e.getX(); + int deltaY = origin.y - e.getY(); + + Rectangle view = jsp.getViewport().getVisibleRect(); + view.x += deltaX; + view.y += deltaY; + + jsp.getViewport().scrollRectToVisible(view); + // } + } + } + + }; + yspc = new YScrollPane(730); + yspc.setOpaque(false); + JPanel configsPanel = new JPanel(); + configsPanel.setLayout(new BorderLayout(0, 0)); + configsPanel.add(yspc); + addSettingItems(yspc); + JButton btnSave = new JButton(UIEnv.getRsb().getString("savesettings")); + btnSave.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + saveConfig(); + } + }); + yspc.add(btnSave, BorderLayout.SOUTH); + tabbedPane.addTab(UIEnv.getRsb().getString("settings"), null, configsPanel, null); + configsPanel.setOpaque(false); + textField.addKeyListener(new KeyListener() { + + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyPressed(KeyEvent e) { + // TODO 自动生成的方法存根 + + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + btnNewButton.doClick(); + } + } + }); + graph.addMouseListener(ma); + graph.addMouseMotionListener(ma); + } + private void saveConfig() { + if(config==null) { + config=new KLALBConfig(); + config.add(new KLALBControllerConfigItem("KLALBController")); + } + for (KLALBConfigItem item : config) { + if (item instanceof KLALBControllerConfigItem) { + KLALBControllerConfigItem kck = (KLALBControllerConfigItem) item; + + kck.setLanguage(((Language)comboLang.getSelectedItem()).name()); + + String ttext=addressFieldSet.getText().trim(); + if(ttext.equals("")) { + kck.setVirtualAddress(null); + }else { + try { + kck.setVirtualAddress(Inet6Address.getByName(ttext).getHostAddress()); + } catch (UnknownHostException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildipv6addr") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + String[]splt=dnsAreaSet.getText().split("\n"); + Listiaddr=new ArrayList(); + boolean show=true; + for (int i = 0; i < splt.length; i++) { + try { + String str=splt[i].trim(); + if(!str.isEmpty()) + iaddr.add( Inet6Address.getByName(str)); + } catch (UnknownHostException e) { + e.printStackTrace(); + if(show) { + show=false; + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invailddnsserver") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + } + kck.setDNS(iaddr); + + String asntext=asnFieldSet.getText(); + if(asntext.equals("")) { + kck.setVirtualASN(null); + }else { + try { + kck.setVirtualASN(Long.parseLong(asntext)); + }catch (NumberFormatException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildasnumber") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + + String tcptext=tcpListeningSet.getText(); + if(tcptext.equals("")) { + kck.setTCPListen(null); + }else { + try { + kck.setTCPListen(new MultipurposeSocketAddress(tcptext)); + }catch (RuntimeException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildtcplisten") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + + String udptext=udpListeningSet.getText(); + if(udptext.equals("")) { + kck.setUDPListen(null); + }else { + try { + kck.setUDPListen(new MultipurposeSocketAddress(udptext)); + }catch (RuntimeException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildudplisten") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + + String[]splt1=openLineTabelSet.getText().split("\n"); + Listiaddr1=new ArrayList(); + boolean show1=true; + for (int i = 0; i < splt1.length; i++) { + try { + String str=splt1[i].trim(); + if(!str.isEmpty()) + iaddr1.add( new MultipurposeSocketAddress(str)); + } catch (RuntimeException e) { + e.printStackTrace(); + if(show1) { + show1=false; + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildopenlinetable") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + } + kck.setLineTable(iaddr1); + + String[]splt11=connectLineTabelSet.getText().split("\n"); + Listiaddr11=new ArrayList(); + boolean show11=true; + for (int i = 0; i < splt11.length; i++) { + try { + String str=splt11[i].trim(); + if(!str.isEmpty()) + iaddr11.add( new MultipurposeSocketAddress(str)); + } catch (RuntimeException e) { + e.printStackTrace(); + if(show11) { + show11=false; + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildconnectlinetable") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + } + } + kck.setConnectLineTable(iaddr11); + } + } + if(saveComsumer!=null) { + saveComsumer.accept(config); + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("saveconfigsuccess")); + } + } + + private void addSettingItems(YScrollPane settings) { + + ComboSettingItem lang = new ComboSettingItem(UIEnv.getRsb().getString("language"), CONST.itemwidth, CONST.settingheight); + comboLang = lang.getComboBox(); + comboLang.addItem(Language.EN_US); + comboLang.addItem(Language.ZH_CN); + settings.getView().add(lang); + settings.updateScrool(); + + SettingItem si = new SettingItem(UIEnv.getRsb().getString("basicsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), + CONST.itemwidth, CONST.settingheight); + settings.getView().add(si); + + TextSettingItem addr6 = new TextSettingItem(UIEnv.getRsb().getString("ipv6addr"), CONST.itemwidth, CONST.settingheight); + addressFieldSet = addr6.getTextField(); + settings.getView().add(addr6); + + TextAreaSettingItem dns = new TextAreaSettingItem(UIEnv.getRsb().getString("dnsserver"), CONST.itemwidth, CONST.settingheight * 5); + dnsAreaSet = dns.getTextArea(); + settings.getView().add(dns); + + TextSettingItem asn = new TextSettingItem(UIEnv.getRsb().getString("asnumber"), CONST.itemwidth, CONST.settingheight); + asnFieldSet = asn.getTextField(); + settings.getView().add(asn); + + TextSettingItem tcpl = new TextSettingItem(UIEnv.getRsb().getString("tcplistening"), CONST.itemwidth, CONST.settingheight); + tcpListeningSet = tcpl.getTextField(); + settings.getView().add(tcpl); + + TextSettingItem udpl = new TextSettingItem(UIEnv.getRsb().getString("udplistening"), CONST.itemwidth, CONST.settingheight); + udpListeningSet = udpl.getTextField(); + settings.getView().add(udpl); + + TextAreaSettingItem olinet = new TextAreaSettingItem(UIEnv.getRsb().getString("openlinetable"), CONST.itemwidth, + CONST.settingheight * 5); + openLineTabelSet = olinet.getTextArea(); + settings.getView().add(olinet); + + TextAreaSettingItem clinet = new TextAreaSettingItem(UIEnv.getRsb().getString("autoconnectlinetable"), CONST.itemwidth, + CONST.settingheight * 5); + connectLineTabelSet = clinet.getTextArea(); + settings.getView().add(clinet); + + SettingItem hi = new SettingItem(UIEnv.getRsb().getString("advancedsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), + CONST.itemwidth, CONST.settingheight); + settings.getView().add(hi); + + ComboSettingItem congress = new ComboSettingItem(UIEnv.getRsb().getString("congresscontrolalgorithm"), CONST.itemwidth, CONST.settingheight); + comboCongress = congress.getComboBox(); + comboCongress.addItem("BBR"); + comboCongress.addItem("Vegas"); + comboCongress.addItem("BBR-Vegas"); + settings.getView().add(congress); + settings.updateScrool(); + + + } + + private void createRefreshTask(KLALBController kc, YScrollPane ysp) { + if (tsk != null) { + tsk.cancel(); + } + tsk = new TimerTask() { + + @Override + public void run() { + Object[] kll; + kll = kc.getLines().toArray(); + + loop: for (int ix = 0; ix < kll.length; ix++) { + KLALBRemoteLine ent = (KLALBRemoteLine) kll[ix]; + /* + * if(ent.getMonitor().getState()!=MonitorData.ONLINE) { continue loop; } + */ + Component[] count = ysp.getView().getComponents(); + for (int i = 0; i < count.length; i++) { + Component tp = count[i]; + if (tp instanceof TPanel2) { + if (((TPanel2) tp).getTunnel().equals(ent)) { + tp.setVisible( + showoffline.isSelected() || ent.getMonitor().getState() == MonitorData.ONLINE); + continue loop; + } + } + } + TPanel2 tp = new TPanel2(ent, kc); + tp.setVisible(showoffline.isSelected() || ent.getMonitor().getState() == MonitorData.ONLINE); + ysp.getView().add(tp); + } + Component[] count = ysp.getView().getComponents(); + for (int i = 0; i < count.length; i++) { + Component tp = count[i]; + if (tp instanceof TPanel2) { + /* + * if((((TPanel2) tp).getTunnel().getMonitor().getState())!=MonitorData.ONLINE) + * { ysp.getView().remove(tp); continue; } + */ + if (kc.getLines().contains(((TPanel2) tp).getTunnel())) { + try { + if (tp.isVisible()) + ((TPanel2) tp).updateTraffic(); + } catch (RuntimeException e) { + e.printStackTrace(); + } + } else { + ysp.getView().remove(tp); + } + } + } + ysp.updateScrool(); + // repaint(); + } + }; + t.scheduleAtFixedRate(tsk, 200, 500); + if (tsk2 != null) { + tsk2.cancel(); + } + tsk2 = new TimerTask() { + + @Override + public void run() { + double outload = kc.getLinkMonitor().getOutSpeed() * 100.0 / kc.getLinkMonitor().getOutSpeedMax2(); + if (Double.isFinite(outload)) { + upSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getOutSpeedAvg()) + "/s"); + upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0)); + } + + double inload = kc.getLinkMonitor().getInSpeed() * 100.0 / kc.getLinkMonitor().getInSpeedMax2(); + if (Double.isFinite(inload)) { + downSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getInSpeedAvg()) + "/s"); + downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0)); + } + + double outPPSload = kc.getLinkMonitor().getOutPPS() * 100.0 / kc.getLinkMonitor().getOutPPSMax2(); + if (Double.isFinite(outPPSload)) { + upPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getOutPPSAvg()) + "PPS"); + upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0)); + } + + double inPPSload = kc.getLinkMonitor().getInPPS() * 100.0 / kc.getLinkMonitor().getInPPSMax2(); + if (Double.isFinite(inPPSload)) { + downPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getInPPSAvg()) + "PPS"); + downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0)); + } + + double outload1 = kc.getDatatMonitor().getOutSpeed() * 100.0 / kc.getLinkMonitor().getOutSpeedMax2(); + if (Double.isFinite(outload1)) { + upDataSpeed + .setValue(Math.min(upDataSpeed.getValue().doubleValue() * 0.98 + outload1 * 0.02, 101.0)); + } + + double inload1 = kc.getDatatMonitor().getInSpeed() * 100.0 / kc.getLinkMonitor().getInSpeedMax2(); + if (Double.isFinite(inload1)) { + downDataSpeed + .setValue(Math.min(downDataSpeed.getValue().doubleValue() * 0.98 + inload1 * 0.02, 101.0)); + } + + double outPPSload1 = kc.getDatatMonitor().getOutPPS() * 100.0 / kc.getLinkMonitor().getOutPPSMax2(); + if (Double.isFinite(outPPSload1)) { + upDataPPS.setValue(Math.min(upDataPPS.getValue().doubleValue() * 0.98 + outPPSload1 * 0.02, 101.0)); + } + + double inPPSload1 = kc.getDatatMonitor().getInPPS() * 100.0 / kc.getLinkMonitor().getInPPSMax2(); + if (Double.isFinite(inPPSload1)) { + downDataPPS + .setValue(Math.min(downDataPPS.getValue().doubleValue() * 0.98 + inPPSload1 * 0.02, 101.0)); + } + + /* + * double + * outefi=kc.getDatatMonitor().getOutSpeedAvg2()*100.0D/kc.getLinkMonitor(). + * getOutSpeedAvg2(); if(Double.isFinite(outefi)) { + * upEfficiency.setValue(upEfficiency.getValue().doubleValue()*0.95+ + * outefi*0.05); upEfficiencyText.setLabel(String.format("%.1f", + * upEfficiency.getValue().doubleValue())+"%"); } + * + * double + * inefi=kc.getDatatMonitor().getInSpeedAvg2()*100.0D/kc.getLinkMonitor(). + * getInSpeedAvg2(); if(Double.isFinite(inefi)) { + * downEfficiency.setValue(downEfficiency.getValue().doubleValue()*0.95+ + * inefi*0.05); downEfficiencyText.setLabel(String.format("%.1f", + * downEfficiency.getValue().doubleValue())+"%"); } + */ + String contt = Long.toString(kc.getIpv6Router().getKlalbRouteProtol().getDevicesFound()); + if (!contt.equals(devicesOnline.getText())) { + devicesOnline.setText(contt); + } + String address = kc.getSelf().getAddress().getHostAddress(); + if (!address.equals(addressField.getText())) { + addressField.setText(address); + } + + String asnstr = Long.toString(kc.getIpv6Router().getASN()); + + if (!asnstr.equals(asnField2.getText())) { + asnField2.setText(asnstr); + } + + } + }; + t2.scheduleAtFixedRate(tsk2, 200, 100); + + if (tsk3 != null) { + tsk3.cancel(); + } + tsk3 = new TimerTask() { + + @Override + public void run() { + Component[] count = ysp.getView().getComponents(); + for (int i = 0; i < count.length; i++) { + Component tp = count[i]; + if (tp instanceof TPanel2) { + try { + ((TPanel2) tp).getMdg().updateTraffic(); + } catch (RuntimeException e) { + e.printStackTrace(); + } + } + } + } + }; + t3.scheduleAtFixedRate(tsk3, 200, 200); + + if (tsk4 != null) { + tsk4.cancel(); + } + tsk4 = new TimerTask() { + + @Override + public void run() { + Component[] count = ysp.getView().getComponents(); + for (int i = 0; i < count.length; i++) { + Component tp = count[i]; + if (tp instanceof TPanel2) { + try { + ((TPanel2) tp).getMdg().recordData(); + } catch (RuntimeException e) { + e.printStackTrace(); + } + } + } + } + }; + t3.scheduleAtFixedRate(tsk4, 200, 20); + if (tsk5 != null) { + tsk5.cancel(); + } + tsk5 = new TimerTask() { + + @Override + public void run() { + graph.loadNodes(); + for (int i = 0; i < 5; i++) { + graph.runPhy(); + } + if (graph.isVisible()) { + graph.repaint(); + graph.revalidate(); + } + } + }; + t.scheduleAtFixedRate(tsk5, 200, 100); + // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + public void loadConfig(KLALBConfig config) { + this.config = config; + for (KLALBConfigItem item : config) { + if (item instanceof KLALBControllerConfigItem) { + KLALBControllerConfigItem kck = (KLALBControllerConfigItem) item; + + String lg=kck.getLanguage(); + if(lg!=null) { + Language l=Language.valueOf( lg); + if(l!=null) { + comboLang.setSelectedItem(l); + } + } + String vaddr = kck.getVirtualAddress(); + if (vaddr != null) { + addressFieldSet.setText(vaddr); + } else { + addressFieldSet.setText(""); + } + + List dns = kck.getDNS(); + String str=listToStr(dns); + + dnsAreaSet.setText(str); + Long vasn = kck.getVirtualASN(); + if (vasn != null) { + asnFieldSet.setText(vasn.toString()); + } else { + asnFieldSet.setText(""); + } + + MultipurposeSocketAddress mpat= kck.getTCPListen(); + if(mpat!=null) { + tcpListeningSet.setText(mpat.toString()); + }else { + tcpListeningSet.setText(""); + } + + MultipurposeSocketAddress mpau= kck.getUDPListen(); + if(mpau!=null) { + udpListeningSet.setText(mpau.toString()); + }else { + udpListeningSet.setText(""); + } + + List linet =kck.getLineTable(); + String str1=listToStr2(linet); + openLineTabelSet.setText(str1); + + List clinet =kck.getConnectLineTable(); + String str2=listToStr2(clinet); + connectLineTabelSet.setText(str2); + } + } + } + + private String listToStr(List dns) { + StringBuilder sbdr = new StringBuilder(); + if (dns != null) + for (InetAddress addrdns : dns) { + sbdr.append(addrdns.getHostAddress()); + sbdr.append('\n'); + } + return sbdr.toString(); + } + + private String listToStr2(List objs) { + StringBuilder sbdr = new StringBuilder(); + if (objs != null) + for (Object addrdns : objs) { + sbdr.append(addrdns); + sbdr.append('\n'); + } + return sbdr.toString(); + } + + public void close() { + setVisible(false); + if (tsk != null) { + tsk.cancel(); + } + st.remove(ti); + } + + public static void main(String[] args) throws IOException, InterruptedException {// ,new + // MultipurposeSocketAddress("frp-mom.top:22226"),new + // MultipurposeSocketAddress("0.0.0.0:26468") + KLALBStateGUI3 kcg = new KLALBStateGUI3(new KLALBController()); + kcg.setVisible(true); + // Thread.sleep(10000); + // kcg.close(); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/Language.java b/src/org/kne/cloud/network/klalb/ui/Language.java new file mode 100644 index 0000000..0cae394 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/Language.java @@ -0,0 +1,19 @@ +package org.kne.cloud.network.klalb.ui; + +import java.util.HashMap; +import java.util.Map; + +public enum Language { + ZH_CN("简体中文","zh_CN"),EN_US("English","en_US"); + private String string,filename; + private Language(String string, String filename) { + this.string=string; + this.filename=filename; + } + public String toString() { + return string; + } + public String getFileName() { + return filename; + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/TPanel2.java b/src/org/kne/cloud/network/klalb/ui/TPanel2.java index 3371571..120badb 100644 --- a/src/org/kne/cloud/network/klalb/ui/TPanel2.java +++ b/src/org/kne/cloud/network/klalb/ui/TPanel2.java @@ -103,7 +103,7 @@ public class TPanel2 extends JPanel { panel.setLayout(new BorderLayout(0, 0)); panel.add(tname); - vaddr = new JLabel("unknown"); + vaddr = new JLabel(UIEnv.getRsb().getString("unknown")); panel.add(vaddr, BorderLayout.SOUTH); vaddr.setForeground(Color.DARK_GRAY); @@ -157,7 +157,7 @@ public class TPanel2 extends JPanel { popupMenu = new JPopupMenu(); - mntmNewMenuItem = new JMenuItem("View line monitor"); + mntmNewMenuItem = new JMenuItem(UIEnv.getRsb().getString("viewlinemonitor")); popupMenu.add(mntmNewMenuItem); mntmNewMenuItem.addActionListener(new ActionListener() { @@ -168,7 +168,7 @@ public class TPanel2 extends JPanel { } }); - JMenuItem mntmNewMenuItemz = new JMenuItem("Copy line address"); + JMenuItem mntmNewMenuItemz = new JMenuItem(UIEnv.getRsb().getString("copylineaddress")); popupMenu.add(mntmNewMenuItemz); mntmNewMenuItemz.addActionListener(new ActionListener() { @@ -178,7 +178,7 @@ public class TPanel2 extends JPanel { } }); - JMenuItem mntmNewMenuItemx = new JMenuItem("Copy virtual address"); + JMenuItem mntmNewMenuItemx = new JMenuItem(UIEnv.getRsb().getString("copyvirtualaddress")); popupMenu.add(mntmNewMenuItemx); mntmNewMenuItemx.addActionListener(new ActionListener() { @@ -191,7 +191,7 @@ public class TPanel2 extends JPanel { - mntmNewMenuItem3 = new JMenuItem("Try reconnect"); + mntmNewMenuItem3 = new JMenuItem(UIEnv.getRsb().getString("tryreconnect")); popupMenu.add(mntmNewMenuItem3); mntmNewMenuItem3.addActionListener(new ActionListener() { @@ -202,7 +202,7 @@ public class TPanel2 extends JPanel { } }); mntmNewMenuItem3.setForeground(Color.GREEN); - mntmNewMenuItem2 = new JMenuItem("Force disconnect"); + mntmNewMenuItem2 = new JMenuItem(UIEnv.getRsb().getString("forcedisconnect")); popupMenu.add(mntmNewMenuItem2); mntmNewMenuItem2.addActionListener(new ActionListener() { @@ -213,7 +213,7 @@ public class TPanel2 extends JPanel { }); mntmNewMenuItem2.setForeground(Color.RED); - JMenuItem mi=new JMenuItem("Remove line"); + JMenuItem mi=new JMenuItem(UIEnv.getRsb().getString("removeline")); popupMenu.add(mi); mi.addActionListener(new ActionListener() { diff --git a/src/org/kne/cloud/network/klalb/ui/UIEnv.java b/src/org/kne/cloud/network/klalb/ui/UIEnv.java index 59830ab..bd79d47 100644 --- a/src/org/kne/cloud/network/klalb/ui/UIEnv.java +++ b/src/org/kne/cloud/network/klalb/ui/UIEnv.java @@ -29,7 +29,7 @@ public class UIEnv { private static ResourceBundle rsb; public static void setRsb(String xrsb) throws IOException { - rsb=new PropertyResourceBundle(UIEnv.class.getResourceAsStream("/knemcl_"+xrsb+".properties")); + rsb=new PropertyResourceBundle(UIEnv.class.getResourceAsStream("/klalb_"+xrsb+".properties")); } public static void setRsb(ResourceBundle xrsb) { @@ -38,7 +38,7 @@ public class UIEnv { public static ResourceBundle getRsb() { if(rsb==null) { try { - rsb=new PropertyResourceBundle(UIEnv.class.getResourceAsStream("/knemcl_en_US.properties")); + rsb=new PropertyResourceBundle(UIEnv.class.getResourceAsStream("/klalb_en_US.properties")); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/org/kne/cloud/network/nathole/Experiment.java b/src/org/kne/cloud/network/nathole/Experiment.java new file mode 100644 index 0000000..42bae28 --- /dev/null +++ b/src/org/kne/cloud/network/nathole/Experiment.java @@ -0,0 +1,16 @@ +package org.kne.cloud.network.nathole; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; + +public class Experiment { + + public static void main(String[] args) throws IOException { + Socket soc=new Socket(); + soc.bind(new InetSocketAddress("kne02.yoyo250.fun", 1234)); + soc.connect(new InetSocketAddress("kne04.yoyo250.fun", 1234)); + System.out.println("连接成功"); + } + +} diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java index 7328c6f..c401711 100644 --- a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java @@ -69,7 +69,7 @@ public class KLALBRoutingProtocol extends Thread{ public static final long HOTSOPT_TIMEOUT = 1000000000; - public static final int HOTSOPT_REPORT_INTERVAL = 100000000; + public static final int HOTSOPT_REPORT_INTERVAL = 50000000; private SRv6Router router; public SRv6Router getRouter() { return router; @@ -83,14 +83,13 @@ public class KLALBRoutingProtocol extends Thread{ private long floodTimer=System.nanoTime(); private long floodTimer2=System.nanoTime(); private long requestTimer=System.nanoTime(); + KLALBVirtualRawSocket ds = null; @Override public void run() { Thread.currentThread().setName("KLALB路由协议接收线程"); getSelfRouterInfo(); - KLALBVirtualRawSocket ds = null; try{ ds=new KLALBVirtualRawSocket(router,router.getLocator().getAddress(), DEFAULT_PROTOCOL_NUMBER); - KLALBVirtualRawSocket ds2=ds; new Thread(()->{ Thread.currentThread().setName("KLALB路由协议接收线程"); @@ -120,14 +119,14 @@ public class KLALBRoutingProtocol extends Thread{ if(debug) System.out.println("update60"); floodTimer=cur; - floodPacket(ds2, null, new RouterInfoPacket(selfRouterInfo,true,-1)); + floodPacket(ds, null, new RouterInfoPacket(selfRouterInfo,true,-1)); } if(cur-floodTimer2>1000000000L) { if(debug) System.out.println("update1"); floodTimer2=cur; - floodPacket(ds2, null, new RouterInfoPacket(selfRouterInfo,true,router.getASN())); + floodPacket(ds, null, new RouterInfoPacket(selfRouterInfo,true,router.getASN())); } //Set requestSet=new HashSet<>(); @@ -174,10 +173,10 @@ public class KLALBRoutingProtocol extends Thread{ for (Iterator> iterator = hotspots.entrySet().iterator(); iterator.hasNext();) { Entry type = (Entry) iterator.next(); - if(type.getValue().checkReportTime()) { + //if(type.getValue().checkReportTime()) { //System.out.println("hotspot address:"+type.getKey()); - writePacket(ds2, new RouterInfoPacket( netmap.get(router.getLocator().getAddress()),false,-1), new InetSocketAddress(type.getKey(), DEFAULT_PORT)); - } + //writePacket(ds2, new RouterInfoPacket( netmap.get(router.getLocator().getAddress()),false,-1), new InetSocketAddress(type.getKey(), DEFAULT_PORT)); + //} if(type.getValue().checkTimeOut()) { iterator.remove(); } @@ -358,7 +357,7 @@ public class KLALBRoutingProtocol extends Thread{ return; } Set> s=netmap.entrySet(); - Mapairs=new HashMap<>(netmap.size()+1); + Mapairs=new HashMap<>(netmap.size()*2,0.4f); Listrias=new ArrayList<>(netmap.size()+1); @@ -620,10 +619,18 @@ public class KLALBRoutingProtocol extends Thread{ if(true) { HotspotAddressTimer hat=hotspots.get(sourceAddress); if(hat==null) { - hotspots.put(sourceAddress, new HotspotAddressTimer()); + hotspots.put(sourceAddress,hat= new HotspotAddressTimer()); }else { hat.refreshTimeout(); } + if(hat.checkReportTime()) { + System.out.println("hotspot address:"+sourceAddress); + try { + writePacket(ds, new RouterInfoPacket( netmap.get(router.getLocator().getAddress()),false,-1), new InetSocketAddress(sourceAddress, DEFAULT_PORT)); + } catch (IOException e) { + e.printStackTrace(); + } + } } } private Map toIpBandwidth=new ConcurrentHashMap(); @@ -646,7 +653,10 @@ public class KLALBRoutingProtocol extends Thread{ NetmapDirections directionsx=directions; if(directionsx==null) return null; - long number= directionsx.getDirection_airs().get(text); + Long l=directionsx.getDirection_airs().get(text); + if(l==null) + return null; + long number= l; long prev= directionsx.getDirection()[(int)number]; if(prev==-1) { return null; diff --git a/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java b/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java index b40d9e4..c46f395 100644 --- a/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java +++ b/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java @@ -1,6 +1,7 @@ package org.kne.cloud.network.srv6; import java.io.IOException; +import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; @@ -17,9 +18,23 @@ public class SRv6PacketReorder { this.packetConsumer=packetConsumer; } - private long jumpTime=500000000L; + private long jumpTime=400000000L; - private Mapmap=new ConcurrentHashMap<>(); + + private long maxCacheingTime=5000000000L; + + private class PacketTimeEntry{ + private IPv6Packet packet; + private long addTime; + public PacketTimeEntry(IPv6Packet packet) { + super(); + this.packet = packet; + this.addTime = System.nanoTime(); + } + + } + + private Mapmap=new ConcurrentHashMap<>(); private long orderTime=System.nanoTime(); @@ -27,7 +42,7 @@ public class SRv6PacketReorder { public void put(IPv6Packet pack, long sequence) throws IOException { //System.out.println(pack.getFlowLabel()+" "+sequence); - map.put(sequence,pack); + map.put(sequence,new PacketTimeEntry(pack)); runOrdering(); } private ReentrantLock orderLock=new ReentrantLock(); @@ -39,13 +54,13 @@ public class SRv6PacketReorder { whi=false; while(true) { - IPv6Packet i6p=map.remove(seqptr.get()); + PacketTimeEntry i6p=map.remove(seqptr.get()); if(i6p!=null) { //System.out.println("Ord:"+i6p.getFlowLabel()+" "+seqptr.get()); seqptr.getAndIncrement(); orderTime=System.nanoTime(); if(packetConsumer!=null) { - packetConsumer.accept(i6p); + packetConsumer.accept(i6p.packet); } }else { break; @@ -69,6 +84,12 @@ public class SRv6PacketReorder { }finally { orderLock.unlock(); } + for (Iterator iterator = map.values().iterator(); iterator.hasNext();) { + PacketTimeEntry type = (PacketTimeEntry) iterator.next(); + if(System.nanoTime()-type.addTime>maxCacheingTime) { + iterator.remove(); + } + } } } diff --git a/src/org/kne/cloud/network/srv6/SRv6Router.java b/src/org/kne/cloud/network/srv6/SRv6Router.java index a85f083..0118131 100644 --- a/src/org/kne/cloud/network/srv6/SRv6Router.java +++ b/src/org/kne/cloud/network/srv6/SRv6Router.java @@ -76,7 +76,7 @@ import com.google.gson.internal.Pair; public class SRv6Router { private static final boolean debug = false; - public static final int MTU = 8192; + public static final int MTU = 16384; public static final int MAX_REROUTE_COUNT=2;//1 @@ -417,7 +417,7 @@ public class SRv6Router { segmentsLeft--; } List repairSegments= klalbRouteProtol.createSegmentList(srh.getAddresses().get(segmentsLeft)); - if(repairSegments ==null) { + if(repairSegments ==null||repairSegments.isEmpty()) { System.out.println("FRR保护失败"); return; } @@ -589,15 +589,15 @@ public class SRv6Router { } if(retry) { - if(System.nanoTime()-start>200000000L) { + if(System.nanoTime()-start>1000000L) { break; } - try { + /*try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); - } - //Thread.yield(); + }*/ + Thread.yield(); //短暂挂起当前线程,待链路速度未超限时重试发送数据包 } }while((!routes.isEmpty())&&retry); @@ -713,6 +713,7 @@ public class SRv6Router { srhh.setSegmentsLeft(newSL); iPv6Packet.setDestinationAddress(srhh.getAddresses().get(newSL)); } + if(iPv6Packet.getPayload().getProtocolNumber()!=KLALBRoutingProtocol.DEFAULT_PROTOCOL_NUMBER) klalbRouteProtol.putHotspotAddress(iPv6Packet.getSourceAddress()); routePacket(iPv6Packet,reroute); }