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);
}