diff --git a/klalb-config.json b/klalb-config.json index ad0c519..4b57d27 100644 --- a/klalb-config.json +++ b/klalb-config.json @@ -2,121 +2,102 @@ { "language": "ZH_CN", "nogui": false, - "VirtualAddress": "2486:1:0:0:0:0:0:8888", + "VirtualAddress": "2486:1:0:0:0:0:0:8889", "VirtualASN": 2142606939373348329, "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", + "TCPListen": "tcp://0.0.0.0:4565", + "UDPListen": "udp://0.0.0.0:4572", + "VirtualSocketName": "kltp", "LineTable": [ - "07f4acdef99b.ofalias.net:4565" + "tcp://kne03.yoyo250.fun:4565", + "tcp://kne04.yoyo250.fun:4565" ], "ConnectLineTable": [ - "home-ipv6.sliveridc1.cn:4565", - "home-ltipv6.sliveridc1.cn:4565", - "cn-gd-gz.sliveridc1.cn:4565" + "tcp://07f4acdef99b.ofalias.net:4565", + "tcp://kne01.yoyo250.fun:4565", + "tcp://kne02.yoyo250.fun:4565" ], "ntpServerTable": [ - "{UDP}ntp1.aliyun.com:123", - "{UDP}ntp2.aliyun.com:123", - "{UDP}ntp3.aliyun.com:123", - "{UDP}ntp4.aliyun.com:123", - "{UDP}ntp5.aliyun.com:123", - "{UDP}ntp6.aliyun.com:123", - "{UDP}ntp7.aliyun.com:123", - "{UDP}ntp1.tencent.com:123", - "{UDP}ntp2.tencent.com:123", - "{UDP}ntp3.tencent.com:123", - "{UDP}ntp4.tencent.com:123", - "{UDP}ntp5.tencent.com:123", - "{UDP}time.google.com:123", - "{UDP}time.apple.com:123", - "{UDP}pool.ntp.org:123", - "{UDP}ntp.ntsc.ac.cn:123", - "{UDP}us.ntp.org.cn:123" + "ntp://ntp1.aliyun.com:123", + "ntp://ntp2.aliyun.com:123", + "ntp://ntp3.aliyun.com:123", + "ntp://ntp4.aliyun.com:123", + "ntp://ntp5.aliyun.com:123", + "ntp://ntp6.aliyun.com:123", + "ntp://ntp7.aliyun.com:123", + "ntp://ntp1.tencent.com:123", + "ntp://ntp2.tencent.com:123", + "ntp://ntp4.tencent.com:123", + "ntp://ntp5.tencent.com:123", + "ntp://time.google.com:123", + "ntp://time.apple.com:123", + "ntp://pool.ntp.org:123", + "ntp://ntp.ntsc.ac.cn:123", + "ntp://us.ntp.org.cn:123" ], - "denyLineTableQuery": true, - "denyLineTableBroadcast": true, + "denyLineTableQuery": false, + "denyLineTableBroadcast": false, "congestionAlgorithm": "BBR", - "burstLimit": 1.5, - "delayUpperBound": 1.3, - "delayLowerBound": 1.3, + "burstLimit": 2.0, + "delayUpperBound": 1.2, + "delayLowerBound": 1.1, "nagleDelayTime": 1000000, "linkNagleDelayTime": 0, "linkConnectionsCount": 1, "TUNName": "KLALB_SRv6", + "performanceStrategy": "multiscatter", "NetworkInterfaceExcepts": [], "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", + "Listen": "kltp://[::0]:5201", "Bridge": { "DEFAULT": "SocketBridge" }, "Connect": { - "DEFAULT": "127.0.0.1:5212" + "DEFAULT": "tcp://127.0.0.1:5201" }, "Type": "SocketBridge" }, { - "Listen": "{KLALB_Stream}[::0]:25565", + "Listen": "tcp://[::1]:5202", "Bridge": { "DEFAULT": "SocketBridge" }, "Connect": { - "DEFAULT": "127.0.0.1:25566" + "DEFAULT": "kltp://[2486:5acd:e339:4837:a6d9:3aed:4de2:30fd]:5201" }, "Type": "SocketBridge" }, { - "Listen": "0.0.0.0:25561", + "Listen": "tcp://127.0.0.1:35000", "Bridge": { - "KLALB": "SocketBridge", - "DEFAULT": "MinecraftSocketBridge23330" + "DEFAULT": "SocketBridge" }, "Connect": { - "KLALB": "127.0.0.1:4565", - "DEFAULT": "127.0.0.1:25562" + "DEFAULT": "kltp://[2486:1::8888]:23333" }, "Type": "SocketBridge" }, { - "Listen": "{KLALB_Stream}[::0]:23330", + "Listen": "kltp://[::0]:25565", "Bridge": { - "DEFAULT": "MinecraftSocketBridge23330" + "DEFAULT": "SocketBridge" }, "Connect": { - "DEFAULT": "127.0.0.1:25562" + "DEFAULT": "tcp://127.0.0.1:25566" + }, + "Type": "SocketBridge" + }, + { + "Listen": "tcp://127.0.0.1:35565", + "Bridge": { + "DEFAULT": "SocketBridge" + }, + "Connect": { + "DEFAULT": "kltp://[2486:1::8888]:25565" }, "Type": "SocketBridge" } diff --git a/klalbclient.ini b/klalbclient.ini deleted file mode 100644 index e69de29..0000000 diff --git a/kserver.ini b/kserver.ini deleted file mode 100644 index cb1a88c..0000000 --- a/kserver.ini +++ /dev/null @@ -1,3 +0,0 @@ -virtualip=cefe:49b8:f837:4b00:b9cd:dbdd:c299:349 -bind=0.0.0.0:4569 -local=127.0.0.1:5212 diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties index 112f698..a4a76cd 100644 --- a/src/klalb_en_US.properties +++ b/src/klalb_en_US.properties @@ -104,4 +104,7 @@ downloadbasedelay=Download Base uploadbasedelay=Upload Base burstlimit=Burst limit performancesettings=Performance settings -performancestrategy=Performance strategy \ No newline at end of file +performancestrategy=Performance strategy +singlecore=Single-Core - Cache Affinity First (Best energy/performance ratio, for low-power & cloud) +multifill=Multi-Core - Fill Cores Sequentially (Recommended for general-purpose physical servers) +multiscatter=Multi-Core - Spread Load Evenly (Optimized for multi-socket NUMA architectures) \ No newline at end of file diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties index 2df6772..dc97fe8 100644 --- a/src/klalb_zh_CN.properties +++ b/src/klalb_zh_CN.properties @@ -104,4 +104,7 @@ downloadbasedelay=下载延迟基线 uploadbasedelay=上传延迟基线 burstlimit=突发限制 performancesettings=性能设置 -performancestrategy=性能策略 \ No newline at end of file +performancestrategy=性能策略 +singlecore=单核-缓存命中率优先(高能耗比,适合低功耗设备、云机) +multifill=多核-负载按顺序填充(适合大多数物理服务器、电脑) +multiscatter=多核-负载均匀打散分配(适合特殊的多路NUMA服务器) \ No newline at end of file diff --git a/src/org/kne/cloud/network/DatagramSocketListener.java b/src/org/kne/cloud/network/DatagramSocketListener.java index 7d3c361..25cf815 100644 --- a/src/org/kne/cloud/network/DatagramSocketListener.java +++ b/src/org/kne/cloud/network/DatagramSocketListener.java @@ -3,14 +3,9 @@ package org.kne.cloud.network; import java.io.Closeable; import java.io.IOException; import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; import java.net.SocketException; import java.util.function.Consumer; -import javax.net.ServerSocketFactory; - public class DatagramSocketListener implements Closeable,AutoCloseable{ private DatagramServerSocket serverSocket; public DatagramServerSocket getDatagramServerSocket() { @@ -36,10 +31,10 @@ public class DatagramSocketListener implements Closeable,AutoCloseable{ } } }; - private MultipurposeSocketAddress multipurposeSocketAddress; + private MultiProtocolSocketAddress multiProtocolSocketAddress; - public DatagramSocketListener(MultipurposeSocketAddress multipurposeSocketAddress) throws IOException { - this.multipurposeSocketAddress=multipurposeSocketAddress; + public DatagramSocketListener(MultiProtocolSocketAddress multiProtocolSocketAddress) throws IOException { + this.multiProtocolSocketAddress = multiProtocolSocketAddress; open(); } public DatagramSocketListener(DatagramServerSocket tserverSocket) throws IOException { @@ -49,7 +44,7 @@ public class DatagramSocketListener implements Closeable,AutoCloseable{ private void open() throws IOException { if(serverSocket==null) - serverSocket=multipurposeSocketAddress.listenDatagramServerSocket(); + serverSocket= multiProtocolSocketAddress.listenDatagramServerSocket(); //new Thread(r).start(); ThreadTool.makePThreadIfSupport("端口监听线程",r).start(); } @@ -63,8 +58,8 @@ public class DatagramSocketListener implements Closeable,AutoCloseable{ - public MultipurposeSocketAddress getMultipurposeSocketAddress() { - return multipurposeSocketAddress; + public MultiProtocolSocketAddress getMultipurposeSocketAddress() { + return multiProtocolSocketAddress; } public Consumer getCon() { diff --git a/src/org/kne/cloud/network/HostPortMap.java b/src/org/kne/cloud/network/HostPortMap.java index f18308f..dbccefb 100644 --- a/src/org/kne/cloud/network/HostPortMap.java +++ b/src/org/kne/cloud/network/HostPortMap.java @@ -1,9 +1,8 @@ package org.kne.cloud.network; -import java.util.HashMap; import java.util.LinkedHashMap; -public class HostPortMap extends LinkedHashMap { +public class HostPortMap extends LinkedHashMap { /** * @@ -11,9 +10,9 @@ public class HostPortMap extends LinkedHashMap msas; + private List msas; private UUID selfUUID; - private volatile Consumer con; + private volatile Consumer con; private long timeInterval; public long getTimeInterval() { @@ -45,7 +36,7 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { this.timeInterval = timeInterval; } - public NetworkInterface getNinterface() { + public NetworkInterface getInterface() { return ninterface; } @@ -54,22 +45,24 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { } public InetSocketAddress getBind() { - return bind; + return (InetSocketAddress) soc.getLocalSocketAddress(); } - public Consumer getCon() { + public Consumer getCon() { return con; } - public void setCon(Consumer con) { + public void setCon(Consumer con) { this.con = con; } public IPMulticastDiscovery(InetSocketAddress bind, InetSocketAddress group, NetworkInterface ninterface, - List msas,UUID node,long timeInterval) throws IOException { - soc = new MulticastSocket(bind); + List msas, UUID node, long timeInterval) throws IOException { + soc = new MulticastSocket(null); + soc.setReuseAddress(true); + soc.bind(bind); + soc.setNetworkInterface(ninterface); soc.joinGroup(group, ninterface); - this.bind = bind; this.group = group; this.ninterface = ninterface; this.msas = msas; @@ -82,46 +75,22 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { ThreadTool.makeVDaemonThreadIfSupport("线路通知线程", () -> { try { while (!closed) { - HashSet s = new HashSet(); - synchronized (msas) { - for (Iterator iterator = msas.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress multipurposeSocketAddress = (MultipurposeSocketAddress) iterator - .next(); + /*MultipurposeSocketAddress mpsa = new MultipurposeSocketAddress( + multipurposeSocketAddress.getType(), "::0", multipurposeSocketAddress.getPort());*/ + if(msas!=null) { + synchronized (msas) { + for (Iterator iterator = msas.iterator(); iterator.hasNext(); ) { + MultiProtocolSocketAddress multiProtocolSocketAddress = (MultiProtocolSocketAddress) iterator + .next(); - MultipurposeSocketAddress mpsa = new MultipurposeSocketAddress( - multipurposeSocketAddress.getType(), "::0", multipurposeSocketAddress.getPort()); - try { - if (s.add(mpsa)) { - boolean bf = true; - Enumeration ei = ninterface.getInetAddresses(); - while (ei.hasMoreElements()) { - InetAddress inetAddress = (InetAddress) ei.nextElement(); - if (inetAddress.equals(multipurposeSocketAddress.getInetAddress())) { - bf = false; - break; + try { + send(multiProtocolSocketAddress); + } catch (NoRouteToHostException | UnknownHostException e) { } - } - if (bf) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dops = new DataOutputStream(baos); - dops.writeInt(multipurposeSocketAddress.getPort()); - dops.writeUTF(multipurposeSocketAddress.getType()); - dops.writeLong(selfUUID.getMostSignificantBits()); - dops.writeLong(selfUUID.getLeastSignificantBits()); - dops.close(); - byte[] b = baos.toByteArray(); - DatagramPacket dp = new DatagramPacket(b, b.length, group); - soc.send(dp); - if(debug) - System.out.println("发送广播:"+multipurposeSocketAddress+" "+group+" "+selfUUID); - } - } - } catch (NoRouteToHostException|UnknownHostException e) { - } - - } - } + } + } + } Thread.sleep(timeInterval); } } catch (IOException e) { @@ -143,28 +112,9 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { try { loop:while (!closed) { try { - byte[] b = new byte[65535]; - DatagramPacket dp = new DatagramPacket(b, b.length); - soc.receive(dp); - ByteArrayInputStream bis = new ByteArrayInputStream(b, 0, dp.getLength()); - DataInputStream dis = new DataInputStream(bis); - int port = dis.readInt(); - String type = dis.readUTF(); - long h=dis.readLong(); - long l=dis.readLong(); - UUID uid=new UUID(h, l); - dis.close(); - MultipurposeSocketAddress mpsa = new MultipurposeSocketAddress(type, dp.getAddress().getHostAddress(), - port); - if(debug) { - if(uid.equals(selfUUID)) { - System.out.println("丢弃广播:"+mpsa+" "+dp.getSocketAddress()+" "+uid); - continue; - }else { - System.out.println("接收广播:"+mpsa+" "+dp.getSocketAddress()+" "+uid); - } - } - InetAddress mpsai=mpsa.getInetAddress(); + MultiProtocolSocketAddress mpsa = receive(); + if (mpsa == null) continue; + InetAddress mpsai=mpsa.getInetAddress(); Enumeration ei = ninterface.getInetAddresses(); while (ei.hasMoreElements()) { InetAddress inetAddress = (InetAddress) ei.nextElement(); @@ -186,7 +136,7 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { if(!isClosed()) e.printStackTrace(); }catch (IOException e) { - System.out.println(bind + " " + group + " " + ninterface); + System.out.println(getBind() + " " + group + " " + ninterface); e.printStackTrace(); } finally { try { @@ -196,7 +146,48 @@ public class IPMulticastDiscovery implements Closeable, AutoCloseable { e.printStackTrace(); } } - }); + }).start(); + } + + private MultiProtocolSocketAddress receive() throws IOException { + byte[] b = new byte[65535]; + DatagramPacket dp = new DatagramPacket(b, b.length); + soc.receive(dp); + ByteArrayInputStream bis = new ByteArrayInputStream(b, 0, dp.getLength()); + DataInputStream dis = new DataInputStream(bis); + String val = dis.readUTF(); + long h=dis.readLong(); + long l=dis.readLong(); + UUID uid=new UUID(h, l); + dis.close(); + MultiProtocolSocketAddress mpsa = new MultiProtocolSocketAddress(val); + if(mpsa.getInetAddress().isAnyLocalAddress()){ + mpsa=new MultiProtocolSocketAddress(mpsa.getProtocol(),dp.getAddress().getHostAddress(),mpsa.getPort()); + } + if(debug) { + if(uid.equals(selfUUID)) { + System.out.println(ninterface.getDisplayName()+" 丢弃广播:"+mpsa+" "+dp.getSocketAddress()+" "+uid); + return null; + }else { + System.out.println(ninterface.getDisplayName()+ " 接收广播:"+mpsa+" "+dp.getSocketAddress()+" "+uid); + } + } + return mpsa; + } + + private void send(MultiProtocolSocketAddress multiProtocolSocketAddress) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dops = new DataOutputStream(baos); + dops.writeUTF(multiProtocolSocketAddress.toString()); + dops.writeLong(selfUUID.getMostSignificantBits()); + dops.writeLong(selfUUID.getLeastSignificantBits()); + dops.close(); + byte[] b = baos.toByteArray(); + DatagramPacket dp = new DatagramPacket(b, b.length, group); + soc.send(dp); + if(debug) + System.out.println(ninterface.getDisplayName()+" 发送广播:"+ multiProtocolSocketAddress +" "+group+" "+selfUUID); + } @Override diff --git a/src/org/kne/cloud/network/MultipurposeSocketAddress.java b/src/org/kne/cloud/network/MultiProtocolSocketAddress.java similarity index 64% rename from src/org/kne/cloud/network/MultipurposeSocketAddress.java rename to src/org/kne/cloud/network/MultiProtocolSocketAddress.java index 7f3fdf4..fb41297 100644 --- a/src/org/kne/cloud/network/MultipurposeSocketAddress.java +++ b/src/org/kne/cloud/network/MultiProtocolSocketAddress.java @@ -1,471 +1,477 @@ -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; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketAddress; -import java.net.UnknownHostException; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -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{ - /** - * - */ - private static final Map socketTypeRegister=new HashMap<>(); - - - static { - socketTypeRegister.put("TCP", new SocketType(new DefaultSocketFactory(), new DefaultServerSocketFactory(),new DefaultSocketChannelFactory(),new DefaultServerSocketChannelFactory())); - socketTypeRegister.put("UDP", new SocketType(new DefaultDatagramSocketFactory(),new DefaultDatagramServerSocketFactory())); - } - - - - public static Map getSocketTypeRegister() { - return socketTypeRegister; - } - private static final long serialVersionUID = 1L; - private String type; - private String host; - private ProtocolStack ps=new ProtocolStack(); - - - private int port; - - public MultipurposeSocketAddress(String hostport) { - this(hostport,"TCP"); - } - public MultipurposeSocketAddress(String hostport,String defaulttype) { - hostport=hostport.trim(); - if (hostport.startsWith("{")) { - int i=hostport.indexOf("}"); - if(i==-1) { - throw new IllegalArgumentException("missing }"); - } - type=hostport.substring(1, i); - hostport=hostport.substring(i+1); - }else { - type=defaulttype; - } - int index =hostport.lastIndexOf(":"); - host=hostport.substring(0,index); - host=host.replace("[", ""); - host=host.replace("]", ""); - String tps=hostport.substring(index+1); - int v=tps.indexOf("("); - if(v!=-1) { - ps.add(new Protocol(tps.substring(v+1,tps.lastIndexOf(")") ))); - tps=tps.substring(0, v); - } - port=Integer.parseInt(tps); - if(port<0) { - throw new IllegalArgumentException("port < 0"); - } - } - @Override - public int hashCode() { - return Objects.hash(host, port, ps, type); - } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MultipurposeSocketAddress other = (MultipurposeSocketAddress) obj; - return Objects.equals(host, other.host) && port == other.port && Objects.equals(ps, other.ps) - && Objects.equals(type, other.type); - } - - public boolean equals2(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MultipurposeSocketAddress other = (MultipurposeSocketAddress) obj; - InetAddress addra=null; - try { - addra = InetAddress.getByName(host); - } catch (UnknownHostException e) { - } - InetAddress addrb=null; - try { - addrb = InetAddress.getByName(other.host); - } catch (UnknownHostException e) { - } - boolean hostequals=Objects.equals(addra, addrb); - - return hostequals && port == other.port && Objects.equals(ps, other.ps) - && Objects.equals(type, other.type); - } - - public MultipurposeSocketAddress(String host2, int port2) { - this("TCP", host2, port2); - } - - public MultipurposeSocketAddress(String type,String host2, int port2) { - host=host2; - port=port2; - this.type=type; - } - public MultipurposeSocketAddress(InetSocketAddress remoteSocketAddress) { - this("TCP",remoteSocketAddress); - } - public MultipurposeSocketAddress(String type,InetSocketAddress remoteSocketAddress) { - host=remoteSocketAddress.getAddress().getHostAddress(); - port=remoteSocketAddress.getPort(); - this.type=type; - } - - - public String getHost() { - return host; - } - public int getPort() { - return port; - } - public String getType() { - return type; - } - - public InetSocketAddress getSocketAddress() { - return new InetSocketAddress(host, port); - } - - @Override - public String toString() { - StringBuilder sb=new StringBuilder(); - if(!"TCP".equals(type)) { - sb.append('{').append(type).append('}'); - } - if(host.contains(":")) { - sb.append('[').append( host).append( "]:").append( port); - }else { - sb.append( host).append( ':').append( port); - } - if(!ps.isEmpty()) { - sb.append('(').append(ps.pop().getName()).append(')'); - } - return sb.toString(); - } - - - - - - public Socket connectSocket(InetAddress bindip,int bindport,int timeout) throws UnknownHostException, IOException { - SocketFactory sf=socketTypeRegister.get(type).getSocketFactory(); - if(sf==null) { - 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(); - throw e; - } - return s; - } - public Socket connectSocket(InetAddress bindip,int bindport) throws UnknownHostException, IOException { - SocketFactory sf=socketTypeRegister.get(type).getSocketFactory(); - if(sf==null) { - 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(); - throw e; - } - return s; - } - public Socket connectSocket() throws UnknownHostException, IOException { - SocketFactory sf=socketTypeRegister.get(type).getSocketFactory(); - if(sf==null) { - throw new UnsupportedOperationException("Socket Unsupported"); - } - Socket s=sf.createSocket(); - try { - s.connect(new InetSocketAddress(host, port)); - }catch(Exception e) { - s.close(); - throw e; - } - return s; - } - public Socket connectSocket(int timeout) throws UnknownHostException, IOException { - SocketFactory sf=socketTypeRegister.get(type).getSocketFactory(); - if(sf==null) { - throw new UnsupportedOperationException("Socket Unsupported"); - } - Socket s=sf.createSocket(); - try { - s.connect(new InetSocketAddress(host, port),timeout); - }catch(Exception e) { - s.close(); - throw e; - } - return s; - } - - - - private static TimeoutTimer tmoTimer=new TimeoutTimer(); - - - - public SocketChannel connectSocketChannel(InetAddress bindip,int bindport,int timeout) throws UnknownHostException, IOException { - SocketChannelFactory sf=socketTypeRegister.get(type).getSocketChannelFactory(); - if(sf==null) { - throw new UnsupportedOperationException("Socket Unsupported"); - } - SocketChannel s=sf.createSocketChannel(); - 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(); - throw e; - }finally { - if(tt!=null) - tt.cancel(); - } - return s; - } - public SocketChannel connectSocketChannel(InetAddress bindip,int bindport) throws UnknownHostException, IOException { - SocketChannelFactory sf=socketTypeRegister.get(type).getSocketChannelFactory(); - if(sf==null) { - 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(); - throw e; - } - return s; - } - public SocketChannel connectSocketChannel() throws UnknownHostException, IOException { - SocketChannelFactory sf=socketTypeRegister.get(type).getSocketChannelFactory(); - if(sf==null) { - throw new UnsupportedOperationException("Socket Unsupported"); - } - SocketChannel s=sf.createSocketChannel(); - try { - s.connect(new InetSocketAddress(host, port)); - }catch(Exception e) { - s.close(); - throw e; - } - return s; - } - public SocketChannel connectSocketChannel(int timeout) throws UnknownHostException, IOException { - SocketChannelFactory sf=socketTypeRegister.get(type).getSocketChannelFactory(); - if(sf==null) { - throw new UnsupportedOperationException("Socket Unsupported"); - } - SocketChannel s=sf.createSocketChannel(); - - TimerTask tt=tmoTimer.createTimeOutTask(s, timeout); - try { - s.connect(new InetSocketAddress(host, port)); - }catch(Exception e) { - s.close(); - throw e; - }finally { - if(tt!=null) - tt.cancel(); - } - return s; - } - - - - - - - public ServerSocket listenServerSocket() throws UnknownHostException, IOException { - ServerSocketFactory srf=socketTypeRegister.get(type).getServerSocketFactory(); - if(srf==null) { - throw new UnsupportedOperationException("ServerSocket Unsupported"); - } - ServerSocket sk=srf.createServerSocket(port, 50, InetAddress.getByName(host)); - return sk; - } - public ServerSocket listenServerSocket(int backlog) throws UnknownHostException, IOException { - ServerSocketFactory srf=socketTypeRegister.get(type).getServerSocketFactory(); - if(srf==null) { - throw new UnsupportedOperationException("ServerSocket Unsupported"); - } - ServerSocket sk=srf.createServerSocket(port, backlog, InetAddress.getByName(host)); - return sk; - } - - - public ServerSocketChannel listenServerSocketChannel() throws UnknownHostException, IOException { - ServerSocketChannelFactory srf=socketTypeRegister.get(type).getServerSocketChannelFactory(); - if(srf==null) { - throw new UnsupportedOperationException("ServerSocket Unsupported"); - } - ServerSocketChannel sk=srf.createServerSocketChannel(port, 50, InetAddress.getByName(host)); - return sk; - } - public ServerSocketChannel listenServerSocketChannel(int backlog) throws UnknownHostException, IOException { - ServerSocketChannelFactory srf=socketTypeRegister.get(type).getServerSocketChannelFactory(); - if(srf==null) { - throw new UnsupportedOperationException("ServerSocket Unsupported"); - } - ServerSocketChannel sk=srf.createServerSocketChannel(port, backlog, InetAddress.getByName(host)); - return sk; - } - - - public boolean isStream() { - return checkIsStream(type); - } - public static boolean checkIsStream(String type2) { - return socketTypeRegister.get(type2).isStream(); - } - public DatagramSocket connectDatagramSocket(InetAddress bindip,int bindport) throws IOException { - DatagramSocketFactory dgs=socketTypeRegister.get(type).getDatagramSocketFactory(); - if(dgs==null) { - 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(); - throw e; - } - return dgd; - } - public DatagramSocket connectDatagramSocket() throws IOException { - DatagramSocketFactory dgs=socketTypeRegister.get(type).getDatagramSocketFactory(); - if(dgs==null) { - throw new UnsupportedOperationException("DatagramSocket Unsupported"); - } - DatagramSocket dgd=dgs.createSocket(); - try { - dgd.connect(new InetSocketAddress(host, port)); - }catch(Exception e) { - dgd.close(); - throw e; - } - return dgd; - } - public DatagramSocket listenDatagramSocket() throws UnknownHostException, IOException { - DatagramSocketFactory dgs=socketTypeRegister.get(type).getDatagramSocketFactory(); - if(dgs==null) { - throw new UnsupportedOperationException("DatagramSocket Unsupported"); - } - DatagramSocket dgd=dgs.createSocket(); - try { - dgd.bind(new InetSocketAddress(host, port)); - }catch(Exception e) { - dgd.close(); - throw e; - } - return dgd; - } - - public DatagramServerSocket listenDatagramServerSocket() throws UnknownHostException, IOException { - DatagramServerSocketFactory srf=socketTypeRegister.get(type).getDatagramServerSocketFactory(); - if(srf==null) { - throw new UnsupportedOperationException("DatagramServerSocket Unsupported"); - } - DatagramServerSocket sk=srf.createDatagramServerSocket(port, 50, InetAddress.getByName(host)); - return sk; - } - public DatagramServerSocket listenDatagramServerSocket(int backlog) throws UnknownHostException, IOException { - DatagramServerSocketFactory srf=socketTypeRegister.get(type).getDatagramServerSocketFactory(); - if(srf==null) { - throw new UnsupportedOperationException("DatagramServerSocket Unsupported"); - } - DatagramServerSocket sk=srf.createDatagramServerSocket(port, backlog, InetAddress.getByName(host)); - return sk; - } - public InetAddress getInetAddress() throws UnknownHostException { - return InetAddress.getByName(host); - } - public InetAddress[] getAllInetAddress() throws UnknownHostException { - return InetAddress.getAllByName(host); - } - public boolean supportNIO() { - SocketType stp= socketTypeRegister.get(getType()); - if(stp==null) - return false; - if(stp.getSocketChannelFactory()==null) { - return false; - }else { - 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()); - } - -} +package org.kne.cloud.network; + +import java.io.IOException; +import java.io.Serializable; +import java.lang.reflect.Type; +import java.net.*; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.*; + +import javax.net.ServerSocketFactory; +import javax.net.SocketFactory; + +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; +import org.kne.cloud.network.ntp.NTPSocketType; + +public class MultiProtocolSocketAddress implements Serializable{ + /** + * + */ + private static final Map socketTypeRegister=new HashMap<>(); + + static { + socketTypeRegister.put("tcp", TCPSocketType.getInstance()); + socketTypeRegister.put("udp", UDPSocketType.getInstance()); + socketTypeRegister.put("ntp", NTPSocketType.getInstance()); + } + + + + public static Map getSocketTypeRegister() { + return socketTypeRegister; + } + private static final long serialVersionUID = 1L; + private String protocol; + private String host; + private ProtocolStack ps=new ProtocolStack(); + + + private int port; + + public MultiProtocolSocketAddress(String hostport) { + this(hostport,"tcp"); + } + public MultiProtocolSocketAddress(String hostport, String defaultprotocol) { + try { + if (!hostport.contains("://")) { + hostport = defaultprotocol.toLowerCase() + "://" + hostport; + } + URI uri = new URI(hostport); + + this.protocol = uri.getScheme().toLowerCase(); + this.host = uri.getHost(); + if (this.host == null) { + throw new IllegalArgumentException("无效的主机地址: " + hostport); + } + this.port = resolvePort(uri, this.protocol); + + // 可选:处理查询参数 + String query = uri.getQuery(); + if (query != null && !query.isEmpty()) { + // 解析查询参数作为扩展信息 + } + } catch (URISyntaxException e) { + throw new IllegalArgumentException("无效的地址格式: " + hostport, e); + } + } + + private int resolvePort(URI uri, String protocol) { + int port = uri.getPort(); + if (port != -1) { + return port; + } + SocketType socketType = socketTypeRegister.get(protocol); + if (socketType != null) { + int defaultPort = socketType.getDefaultPort(); + if (defaultPort != -1) { + return defaultPort; + } + } + throw new IllegalArgumentException( + "未指定端口号,且协议 " + protocol + " 没有默认端口: " + uri + ); + } + @Override + public int hashCode() { + return Objects.hash(host, port, ps, protocol); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MultiProtocolSocketAddress other = (MultiProtocolSocketAddress) obj; + return Objects.equals(host, other.host) && port == other.port && Objects.equals(ps, other.ps) + && Objects.equals(protocol, other.protocol); + } + + public boolean equals2(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MultiProtocolSocketAddress other = (MultiProtocolSocketAddress) obj; + InetAddress addra=null; + try { + addra = InetAddress.getByName(host); + } catch (UnknownHostException e) { + } + InetAddress addrb=null; + try { + addrb = InetAddress.getByName(other.host); + } catch (UnknownHostException e) { + } + boolean hostequals=Objects.equals(addra, addrb); + + return hostequals && port == other.port && Objects.equals(ps, other.ps) + && Objects.equals(protocol, other.protocol); + } + + public MultiProtocolSocketAddress(String host2, int port2) { + this("tcp", host2, port2); + } + + public MultiProtocolSocketAddress(String protocol, String host2, int port2) { + host=host2; + port=port2; + this.protocol = protocol; + } + public MultiProtocolSocketAddress(InetSocketAddress remoteSocketAddress) { + this("tcp",remoteSocketAddress); + } + public MultiProtocolSocketAddress(String protocol, InetSocketAddress remoteSocketAddress) { + host=remoteSocketAddress.getAddress().getHostAddress(); + port=remoteSocketAddress.getPort(); + this.protocol = protocol; + } + + + public String getHost() { + return host; + } + public int getPort() { + return port; + } + public String getProtocol() { + return protocol; + } + + public InetSocketAddress getSocketAddress() { + return new InetSocketAddress(host, port); + } + + @Override + public String toString() { + try { + // 获取协议的默认端口 + SocketType socketType = socketTypeRegister.get(protocol); + int defaultPort = (socketType != null) ? socketType.getDefaultPort() : -1; + + // 如果当前端口等于默认端口,则隐去端口号 + int portToUse = (defaultPort != -1 && this.port == defaultPort) ? -1 : this.port; + + URI uri = new URI(protocol, null, host, portToUse, null, null, null); + return uri.toString(); + } catch (URISyntaxException e) { + return protocol + "://" + host + ":" + port; + } + } + + + + public Socket connectSocket(InetAddress bindip,int bindport,int timeout) throws UnknownHostException, IOException { + SocketFactory sf=socketTypeRegister.get(protocol).getSocketFactory(); + if(sf==null) { + 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(); + throw e; + } + return s; + } + public Socket connectSocket(InetAddress bindip,int bindport) throws UnknownHostException, IOException { + SocketFactory sf=socketTypeRegister.get(protocol).getSocketFactory(); + if(sf==null) { + 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(); + throw e; + } + return s; + } + public Socket connectSocket() throws UnknownHostException, IOException { + SocketFactory sf=socketTypeRegister.get(protocol).getSocketFactory(); + if(sf==null) { + throw new UnsupportedOperationException("Socket Unsupported"); + } + Socket s=sf.createSocket(); + try { + s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + throw e; + } + return s; + } + public Socket connectSocket(int timeout) throws UnknownHostException, IOException { + SocketFactory sf=socketTypeRegister.get(protocol).getSocketFactory(); + if(sf==null) { + throw new UnsupportedOperationException("Socket Unsupported"); + } + Socket s=sf.createSocket(); + try { + s.connect(new InetSocketAddress(host, port),timeout); + }catch(Exception e) { + s.close(); + throw e; + } + return s; + } + + + + private static TimeoutTimer tmoTimer=new TimeoutTimer(); + + + + public SocketChannel connectSocketChannel(InetAddress bindip,int bindport,int timeout) throws UnknownHostException, IOException { + SocketChannelFactory sf=socketTypeRegister.get(protocol).getSocketChannelFactory(); + if(sf==null) { + throw new UnsupportedOperationException("Socket Unsupported"); + } + SocketChannel s=sf.createSocketChannel(); + 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(); + throw e; + }finally { + if(tt!=null) + tt.cancel(); + } + return s; + } + public SocketChannel connectSocketChannel(InetAddress bindip,int bindport) throws UnknownHostException, IOException { + SocketChannelFactory sf=socketTypeRegister.get(protocol).getSocketChannelFactory(); + if(sf==null) { + 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(); + throw e; + } + return s; + } + public SocketChannel connectSocketChannel() throws UnknownHostException, IOException { + SocketChannelFactory sf=socketTypeRegister.get(protocol).getSocketChannelFactory(); + if(sf==null) { + throw new UnsupportedOperationException("Socket Unsupported"); + } + SocketChannel s=sf.createSocketChannel(); + try { + s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + throw e; + } + return s; + } + public SocketChannel connectSocketChannel(int timeout) throws UnknownHostException, IOException { + SocketChannelFactory sf=socketTypeRegister.get(protocol).getSocketChannelFactory(); + if(sf==null) { + throw new UnsupportedOperationException("Socket Unsupported"); + } + SocketChannel s=sf.createSocketChannel(); + + TimerTask tt=tmoTimer.createTimeOutTask(s, timeout); + try { + s.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + s.close(); + throw e; + }finally { + if(tt!=null) + tt.cancel(); + } + return s; + } + + + + + + + public ServerSocket listenServerSocket() throws UnknownHostException, IOException { + ServerSocketFactory srf=socketTypeRegister.get(protocol).getServerSocketFactory(); + if(srf==null) { + throw new UnsupportedOperationException("ServerSocket Unsupported"); + } + ServerSocket sk=srf.createServerSocket(port, 50, InetAddress.getByName(host)); + return sk; + } + public ServerSocket listenServerSocket(int backlog) throws UnknownHostException, IOException { + ServerSocketFactory srf=socketTypeRegister.get(protocol).getServerSocketFactory(); + if(srf==null) { + throw new UnsupportedOperationException("ServerSocket Unsupported"); + } + ServerSocket sk=srf.createServerSocket(port, backlog, InetAddress.getByName(host)); + return sk; + } + + + public ServerSocketChannel listenServerSocketChannel() throws UnknownHostException, IOException { + ServerSocketChannelFactory srf=socketTypeRegister.get(protocol).getServerSocketChannelFactory(); + if(srf==null) { + throw new UnsupportedOperationException("ServerSocket Unsupported"); + } + ServerSocketChannel sk=srf.createServerSocketChannel(port, 50, InetAddress.getByName(host)); + return sk; + } + public ServerSocketChannel listenServerSocketChannel(int backlog) throws UnknownHostException, IOException { + ServerSocketChannelFactory srf=socketTypeRegister.get(protocol).getServerSocketChannelFactory(); + if(srf==null) { + throw new UnsupportedOperationException("ServerSocket Unsupported"); + } + ServerSocketChannel sk=srf.createServerSocketChannel(port, backlog, InetAddress.getByName(host)); + return sk; + } + + + public boolean isStream() { + return checkIsStream(protocol); + } + public static boolean checkIsStream(String type2) { + return socketTypeRegister.get(type2).isStream(); + } + public DatagramSocket connectDatagramSocket(InetAddress bindip,int bindport) throws IOException { + DatagramSocketFactory dgs=socketTypeRegister.get(protocol).getDatagramSocketFactory(); + if(dgs==null) { + 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(); + throw e; + } + return dgd; + } + public DatagramSocket connectDatagramSocket() throws IOException { + DatagramSocketFactory dgs=socketTypeRegister.get(protocol).getDatagramSocketFactory(); + if(dgs==null) { + throw new UnsupportedOperationException("DatagramSocket Unsupported"); + } + DatagramSocket dgd=dgs.createSocket(); + try { + dgd.connect(new InetSocketAddress(host, port)); + }catch(Exception e) { + dgd.close(); + throw e; + } + return dgd; + } + public DatagramSocket listenDatagramSocket() throws UnknownHostException, IOException { + DatagramSocketFactory dgs=socketTypeRegister.get(protocol).getDatagramSocketFactory(); + if(dgs==null) { + throw new UnsupportedOperationException("DatagramSocket Unsupported"); + } + DatagramSocket dgd=dgs.createSocket(); + try { + dgd.bind(new InetSocketAddress(host, port)); + }catch(Exception e) { + dgd.close(); + throw e; + } + return dgd; + } + + public DatagramServerSocket listenDatagramServerSocket() throws UnknownHostException, IOException { + DatagramServerSocketFactory srf=socketTypeRegister.get(protocol).getDatagramServerSocketFactory(); + if(srf==null) { + throw new UnsupportedOperationException("DatagramServerSocket Unsupported"); + } + DatagramServerSocket sk=srf.createDatagramServerSocket(port, 50, InetAddress.getByName(host)); + return sk; + } + public DatagramServerSocket listenDatagramServerSocket(int backlog) throws UnknownHostException, IOException { + DatagramServerSocketFactory srf=socketTypeRegister.get(protocol).getDatagramServerSocketFactory(); + if(srf==null) { + throw new UnsupportedOperationException("DatagramServerSocket Unsupported"); + } + DatagramServerSocket sk=srf.createDatagramServerSocket(port, backlog, InetAddress.getByName(host)); + return sk; + } + public InetAddress getInetAddress() throws UnknownHostException { + return InetAddress.getByName(host); + } + public InetAddress[] getAllInetAddress() throws UnknownHostException { + return InetAddress.getAllByName(host); + } + public boolean supportNIO() { + SocketType stp= socketTypeRegister.get(getProtocol()); + if(stp==null) + return false; + if(stp.getSocketChannelFactory()==null) { + return false; + }else { + return true; + } + } + + public static JsonDeserializergetDefaultJsonDeserializer(){ + return new JsonDeserializer() { + + @Override + public MultiProtocolSocketAddress deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) + throws JsonParseException { + if(arg0.isJsonPrimitive()) { + JsonPrimitive jp=(JsonPrimitive) arg0; + if(jp.isString()) { + MultiProtocolSocketAddress msa=new MultiProtocolSocketAddress(jp.getAsString()); + // System.out.println(msa); + return msa; + } + } + throw new JsonParseException("not a string:"+arg0); + } + }; + } + public static JsonSerializergetDefaultJsonSerializer(){ + return new JsonSerializer() { + + @Override + public JsonElement serialize(MultiProtocolSocketAddress arg0, Type arg1, JsonSerializationContext arg2) { + return new JsonPrimitive(arg0.toString()); + } + }; + } + + public static void registerToGsonBuilder(GsonBuilder gsonBuilder) { + gsonBuilder.registerTypeAdapter(MultiProtocolSocketAddress.class, getDefaultJsonDeserializer()); + gsonBuilder.registerTypeAdapter(MultiProtocolSocketAddress.class, getDefaultJsonSerializer()); + } + +} diff --git a/src/org/kne/cloud/network/NetworkService.java b/src/org/kne/cloud/network/NetworkService.java index 9e4a6b5..7fe91e2 100644 --- a/src/org/kne/cloud/network/NetworkService.java +++ b/src/org/kne/cloud/network/NetworkService.java @@ -1,9 +1,9 @@ package org.kne.cloud.network; public interface NetworkService { - public void listen(MultipurposeSocketAddress msa); - public void unlisten(MultipurposeSocketAddress msc); + public void listen(MultiProtocolSocketAddress msa); + public void unlisten(MultiProtocolSocketAddress msc); - public void connect(MultipurposeSocketAddress msa); - public void unconnect(MultipurposeSocketAddress msc); + public void connect(MultiProtocolSocketAddress msa); + public void unconnect(MultiProtocolSocketAddress msc); } diff --git a/src/org/kne/cloud/network/PortRelay.java b/src/org/kne/cloud/network/PortRelay.java index cade983..caf1330 100644 --- a/src/org/kne/cloud/network/PortRelay.java +++ b/src/org/kne/cloud/network/PortRelay.java @@ -1,13 +1,7 @@ package org.kne.cloud.network; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.net.*; -import java.nio.ByteBuffer; -import java.nio.channels.*; -import java.nio.channels.spi.AbstractInterruptibleChannel; -import java.util.*; public class PortRelay { private int port; @@ -16,8 +10,8 @@ public class PortRelay { public PortRelay(int port, HostPortMap services) throws IOException { this.services = services; this.port = port; - MultipurposeSocketAddress.getSocketTypeRegister().put("ProtocolDetectorServerSocket",new SocketType(null, new ProtocolDetectorServerSocketFactory()) ); - ssc=new SocketListener(new MultipurposeSocketAddress("ProtocolDetectorServerSocket", "0.0.0.0", port)); + MultiProtocolSocketAddress.getSocketTypeRegister().put("ProtocolDetectorServerSocket",new SocketType(null, new ProtocolDetectorServerSocketFactory()) ); + ssc=new SocketListener(new MultiProtocolSocketAddress("ProtocolDetectorServerSocket", "0.0.0.0", port)); } public void start() throws IOException { ssc.setCon((s)->{ @@ -30,7 +24,7 @@ public class PortRelay { }else { nx=pds.getProtocolStack().pop().getName(); } - MultipurposeSocketAddress hp=services.get(nx); + MultiProtocolSocketAddress hp=services.get(nx); InetSocketAddress sa=(InetSocketAddress) s.getRemoteSocketAddress(); System.out.println(sa.getAddress().getHostAddress() + ":" + port + "-" + "(" + nx + ")->" + hp.getHost() + ":" + hp.getPort()); diff --git a/src/org/kne/cloud/network/ServiceElement.java b/src/org/kne/cloud/network/ServiceElement.java index 6fd86b7..47e4cb8 100644 --- a/src/org/kne/cloud/network/ServiceElement.java +++ b/src/org/kne/cloud/network/ServiceElement.java @@ -1,23 +1,19 @@ package org.kne.cloud.network; import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; public class ServiceElement { public String name; public String protocol; - public MultipurposeSocketAddress ipport; + public MultiProtocolSocketAddress ipport; public ServiceElement(String ini) throws UnknownHostException { String[]t=ini.split("\\$"); if(t.length==1) { protocol=""; - ipport=new MultipurposeSocketAddress(t[0]); + ipport=new MultiProtocolSocketAddress(t[0]); }else { protocol=t[0]; - ipport=new MultipurposeSocketAddress(t[1]); + ipport=new MultiProtocolSocketAddress(t[1]); } } public ServiceElement() { diff --git a/src/org/kne/cloud/network/ServiceToSocketProxy.java b/src/org/kne/cloud/network/ServiceToSocketProxy.java index 6299a34..105ea7a 100644 --- a/src/org/kne/cloud/network/ServiceToSocketProxy.java +++ b/src/org/kne/cloud/network/ServiceToSocketProxy.java @@ -1,21 +1,20 @@ package org.kne.cloud.network; import java.io.IOException; -import java.util.function.Consumer; public class ServiceToSocketProxy extends Proxy{ public NetworkService getSrc() { return src; } - public MultipurposeSocketAddress getDes() { + public MultiProtocolSocketAddress getDes() { return des; } public ServiceToSocketProxy(String l, String r) { src=getRegister().get(l.substring(1, l.length()-1)); - des=new MultipurposeSocketAddress(r); + des=new MultiProtocolSocketAddress(r); } private NetworkService src; - private MultipurposeSocketAddress des; + private MultiProtocolSocketAddress des; @Override public void close() throws IOException { // TODO 自动生成的方法存根 diff --git a/src/org/kne/cloud/network/SocketChannelListener.java b/src/org/kne/cloud/network/SocketChannelListener.java index 8fb3702..dbbf652 100644 --- a/src/org/kne/cloud/network/SocketChannelListener.java +++ b/src/org/kne/cloud/network/SocketChannelListener.java @@ -50,10 +50,10 @@ public class SocketChannelListener implements Closeable,AutoCloseable{ } } }; - private MultipurposeSocketAddress multipurposeSocketAddress; + private MultiProtocolSocketAddress multiProtocolSocketAddress; - public SocketChannelListener(MultipurposeSocketAddress multipurposeSocketAddress) throws IOException { - this.multipurposeSocketAddress=multipurposeSocketAddress; + public SocketChannelListener(MultiProtocolSocketAddress multiProtocolSocketAddress) throws IOException { + this.multiProtocolSocketAddress = multiProtocolSocketAddress; open(); } public SocketChannelListener(ServerSocketChannel tserverSocket) throws IOException { @@ -62,9 +62,9 @@ public class SocketChannelListener implements Closeable,AutoCloseable{ } protected void open() throws UnknownHostException, IOException { if(serverSocketChannel==null) - serverSocketChannel=multipurposeSocketAddress.listenServerSocketChannel(); + serverSocketChannel= multiProtocolSocketAddress.listenServerSocketChannel(); if(serverSocketChannel==null) { - throw new IOException(multipurposeSocketAddress.getType()+" unsupport SocketChannel"); + throw new IOException(multiProtocolSocketAddress.getProtocol()+" unsupport SocketChannel"); } ThreadTool.makeVThread("端口监听线程", r).start(); } @@ -82,8 +82,8 @@ public class SocketChannelListener implements Closeable,AutoCloseable{ - public MultipurposeSocketAddress getMultipurposeSocketAddress() { - return multipurposeSocketAddress; + public MultiProtocolSocketAddress getMultipurposeSocketAddress() { + return multiProtocolSocketAddress; } public Consumer getCon() { diff --git a/src/org/kne/cloud/network/SocketListener.java b/src/org/kne/cloud/network/SocketListener.java index fd2213d..f918838 100644 --- a/src/org/kne/cloud/network/SocketListener.java +++ b/src/org/kne/cloud/network/SocketListener.java @@ -2,15 +2,12 @@ package org.kne.cloud.network; import java.io.Closeable; import java.io.IOException; -import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.util.function.Consumer; -import javax.net.ServerSocketFactory; - public class SocketListener implements Closeable,AutoCloseable{ protected ServerSocket serverSocket; public ServerSocket getServerSocket() { @@ -53,10 +50,10 @@ public class SocketListener implements Closeable,AutoCloseable{ } } }; - private MultipurposeSocketAddress multipurposeSocketAddress; + private MultiProtocolSocketAddress multiProtocolSocketAddress; - public SocketListener(MultipurposeSocketAddress multipurposeSocketAddress) throws IOException { - this.multipurposeSocketAddress=multipurposeSocketAddress; + public SocketListener(MultiProtocolSocketAddress multiProtocolSocketAddress) throws IOException { + this.multiProtocolSocketAddress = multiProtocolSocketAddress; open(); } public SocketListener(ServerSocket tserverSocket) throws IOException { @@ -65,7 +62,7 @@ public class SocketListener implements Closeable,AutoCloseable{ } protected void open() throws UnknownHostException, IOException { if(serverSocket==null) - serverSocket=multipurposeSocketAddress.listenServerSocket(); + serverSocket= multiProtocolSocketAddress.listenServerSocket(); ThreadTool.makeVThread("端口监听线程", r).start(); } public void close() { @@ -82,8 +79,8 @@ public class SocketListener implements Closeable,AutoCloseable{ - public MultipurposeSocketAddress getMultipurposeSocketAddress() { - return multipurposeSocketAddress; + public MultiProtocolSocketAddress getMultipurposeSocketAddress() { + return multiProtocolSocketAddress; } public Consumer getCon() { diff --git a/src/org/kne/cloud/network/SocketToServiceProxy.java b/src/org/kne/cloud/network/SocketToServiceProxy.java index dc407ac..f0b0af3 100644 --- a/src/org/kne/cloud/network/SocketToServiceProxy.java +++ b/src/org/kne/cloud/network/SocketToServiceProxy.java @@ -1,21 +1,19 @@ package org.kne.cloud.network; import java.io.IOException; -import java.net.Socket; -import java.util.function.Consumer; public class SocketToServiceProxy extends Proxy { public SocketToServiceProxy(String l, String r) { - src=new MultipurposeSocketAddress(l); + src=new MultiProtocolSocketAddress(l); des=getRegister().get(r.substring(1, r.length()-1)) ; } - public MultipurposeSocketAddress getSrc() { + public MultiProtocolSocketAddress getSrc() { return src; } public NetworkService getDes() { return des; } - private MultipurposeSocketAddress src; + private MultiProtocolSocketAddress src; private NetworkService des; @Override public void close() throws IOException { diff --git a/src/org/kne/cloud/network/SocketToSocketProxy.java b/src/org/kne/cloud/network/SocketToSocketProxy.java index 63896ee..3a24d05 100644 --- a/src/org/kne/cloud/network/SocketToSocketProxy.java +++ b/src/org/kne/cloud/network/SocketToSocketProxy.java @@ -4,10 +4,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; -import java.net.SocketOption; -import java.net.SocketOptions; import java.net.StandardSocketOptions; -import java.net.UnknownHostException; import java.nio.channels.SocketChannel; import java.util.Map; @@ -15,8 +12,8 @@ public class SocketToSocketProxy extends Proxy { private SocketListener sl; private SocketChannelListener scl; private DatagramSocketListener dsl; - private MultipurposeSocketAddress listen, cbind, defaultConnect; - private Map detectedConnect; + private MultiProtocolSocketAddress listen, cbind, defaultConnect; + private Map detectedConnect; private SocketBridgeFactory defaultFactory; private SocketChannelBridgeFactory defaultChannelFactory; private Map detectedFactory; @@ -30,28 +27,28 @@ public class SocketToSocketProxy extends Proxy { this.defaultSoTimeout = defaultSoTimeout; } - public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress connect) throws IOException { - this(listen, new MultipurposeSocketAddress(new InetSocketAddress(0)), connect); + public SocketToSocketProxy(MultiProtocolSocketAddress listen, MultiProtocolSocketAddress connect) throws IOException { + this(listen, new MultiProtocolSocketAddress(new InetSocketAddress(0)), connect); } public SocketToSocketProxy(String l, String r) throws IOException { - this(new MultipurposeSocketAddress(l), new MultipurposeSocketAddress(r)); + this(new MultiProtocolSocketAddress(l), new MultiProtocolSocketAddress(r)); } - public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind, - MultipurposeSocketAddress defaultConnect, Map detectedConnect) + public SocketToSocketProxy(MultiProtocolSocketAddress listen, MultiProtocolSocketAddress cbind, + MultiProtocolSocketAddress defaultConnect, Map detectedConnect) throws IOException { this(listen,cbind,defaultConnect,detectedConnect,new DefaultSocketBridgeFactory(),null); } - public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind, - MultipurposeSocketAddress defaultConnect, Map detectedConnect,SocketBridgeFactory defaultFactory,Map detectedFactory) + public SocketToSocketProxy(MultiProtocolSocketAddress listen, MultiProtocolSocketAddress cbind, + MultiProtocolSocketAddress defaultConnect, Map detectedConnect, SocketBridgeFactory defaultFactory, Map detectedFactory) throws IOException { this(listen, cbind, defaultConnect, detectedConnect, defaultFactory, detectedFactory, new DefaultSocketChannelBridgeFactory()); } - public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind, - MultipurposeSocketAddress defaultConnect, Map detectedConnect,SocketBridgeFactory defaultFactory,Map detectedFactory,SocketChannelBridgeFactory defaultChannelFactory) + public SocketToSocketProxy(MultiProtocolSocketAddress listen, MultiProtocolSocketAddress cbind, + MultiProtocolSocketAddress defaultConnect, Map detectedConnect, SocketBridgeFactory defaultFactory, Map detectedFactory, SocketChannelBridgeFactory defaultChannelFactory) throws IOException { this.listen = listen; this.cbind = cbind; @@ -66,8 +63,8 @@ public class SocketToSocketProxy extends Proxy { open(); } - public SocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind, - MultipurposeSocketAddress defaultConnect) throws IOException { + public SocketToSocketProxy(MultiProtocolSocketAddress listen, MultiProtocolSocketAddress cbind, + MultiProtocolSocketAddress defaultConnect) throws IOException { this(listen, cbind, defaultConnect,null); } @@ -112,7 +109,7 @@ public class SocketToSocketProxy extends Proxy { ProtocolStack ps = ((ProtocolDetectorSocket) sox).getProtocolStack(); if (!ps.isEmpty()) { String pname=ps.pop().getName(); - MultipurposeSocketAddress pmsa = detectedConnect.get(pname); + MultiProtocolSocketAddress pmsa = detectedConnect.get(pname); if(pmsa!=null) { sk = pmsa.connectSocket(InetAddress.getByName(cbind.getHost()), cbind.getPort()); }else { @@ -178,19 +175,19 @@ public class SocketToSocketProxy extends Proxy { sb.run(); } - public MultipurposeSocketAddress getListen() { + public MultiProtocolSocketAddress getListen() { return listen; } - public MultipurposeSocketAddress getCbind() { + public MultiProtocolSocketAddress getCbind() { return cbind; } - public MultipurposeSocketAddress getDefaultConnect() { + public MultiProtocolSocketAddress getDefaultConnect() { return defaultConnect; } - public Map getDetectedConnect() { + public Map getDetectedConnect() { return detectedConnect; } diff --git a/src/org/kne/cloud/network/SocketType.java b/src/org/kne/cloud/network/SocketType.java index d12d18f..9884946 100644 --- a/src/org/kne/cloud/network/SocketType.java +++ b/src/org/kne/cloud/network/SocketType.java @@ -15,6 +15,7 @@ public class SocketType { private DatagramSocketFactory datagramSocketFactory; private DatagramServerSocketFactory datagramServerSocketFactory; private boolean stream; + private int defaultPort=-1; public SocketFactory Channel() { return socketFactory; @@ -74,5 +75,7 @@ public class SocketType { return stream; } - + public int getDefaultPort(){ + return defaultPort; + } } diff --git a/src/org/kne/cloud/network/TCPSocketType.java b/src/org/kne/cloud/network/TCPSocketType.java new file mode 100644 index 0000000..8de36b7 --- /dev/null +++ b/src/org/kne/cloud/network/TCPSocketType.java @@ -0,0 +1,23 @@ +package org.kne.cloud.network; + +public class TCPSocketType extends SocketType { + private static final TCPSocketType INSTANCE = new TCPSocketType(); + + private TCPSocketType() { + super( + new DefaultSocketFactory(), + new DefaultServerSocketFactory(), + new DefaultSocketChannelFactory(), + new DefaultServerSocketChannelFactory() + ); + } + + public static TCPSocketType getInstance() { + return INSTANCE; + } + + @Override + public boolean isStream() { + return true; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/UDPSocketType.java b/src/org/kne/cloud/network/UDPSocketType.java new file mode 100644 index 0000000..931f528 --- /dev/null +++ b/src/org/kne/cloud/network/UDPSocketType.java @@ -0,0 +1,21 @@ +package org.kne.cloud.network; + +public class UDPSocketType extends SocketType { + private static final UDPSocketType INSTANCE = new UDPSocketType(); + + protected UDPSocketType() { + super( + new DefaultDatagramSocketFactory(), + new DefaultDatagramServerSocketFactory() + ); + } + + public static UDPSocketType getInstance() { + return INSTANCE; + } + + @Override + public boolean isStream() { + return false; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/frpc/FrpcServerSocket.java b/src/org/kne/cloud/network/frpc/FrpcServerSocket.java index 91fccd7..e5609e4 100644 --- a/src/org/kne/cloud/network/frpc/FrpcServerSocket.java +++ b/src/org/kne/cloud/network/frpc/FrpcServerSocket.java @@ -4,16 +4,13 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; -import java.net.Socket; import java.net.SocketAddress; import java.net.SocketImpl; import java.net.UnknownHostException; import java.util.Iterator; -import java.util.Map.Entry; import java.util.Set; -import org.ini4j.Profile.Section; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; public class FrpcServerSocket extends ServerSocket { private FrpcProcess frpc; @@ -76,10 +73,10 @@ public class FrpcServerSocket extends ServerSocket { return frpcini.getRemotePort(tunnel); } - public MultipurposeSocketAddress getTunnelSocketAddress() { + public MultiProtocolSocketAddress getTunnelSocketAddress() { if (!isBound()) return null; - return new MultipurposeSocketAddress(frpcini.getType(tunnel).toUpperCase(),getTunnelHost(), getTunnelPort()); + return new MultiProtocolSocketAddress(frpcini.getType(tunnel).toUpperCase(),getTunnelHost(), getTunnelPort()); } @Override diff --git a/src/org/kne/cloud/network/klalb/DatagramKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/DatagramKLALBPacketLink.java index c2626e0..6ce86de 100644 --- a/src/org/kne/cloud/network/klalb/DatagramKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/DatagramKLALBPacketLink.java @@ -116,9 +116,7 @@ public class DatagramKLALBPacketLink implements KLALBPacketLink { }*/ package org.kne.cloud.network.klalb; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; @@ -128,15 +126,14 @@ import java.net.SocketException; import java.nio.ByteBuffer; import org.kne.cloud.network.DatagramServerSocket; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.NetworkPacket; -import org.kne.cloud.network.SpeedLimiter; public class DatagramKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink { @Override public String toString() { - return new MultipurposeSocketAddress("UDP",(InetSocketAddress)ds.getLocalSocketAddress())+"←"+new MultipurposeSocketAddress("UDP",(InetSocketAddress)ds.getRemoteSocketAddress()); + return new MultiProtocolSocketAddress("UDP",(InetSocketAddress)ds.getLocalSocketAddress())+"←"+new MultiProtocolSocketAddress("UDP",(InetSocketAddress)ds.getRemoteSocketAddress()); } private DatagramSocket ds; diff --git a/src/org/kne/cloud/network/klalb/KLALBConfig.java b/src/org/kne/cloud/network/klalb/KLALBConfig.java index d31e91f..94cdff8 100644 --- a/src/org/kne/cloud/network/klalb/KLALBConfig.java +++ b/src/org/kne/cloud/network/klalb/KLALBConfig.java @@ -1,39 +1,31 @@ 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 org.kne.cloud.network.MultiProtocolSocketAddress; 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 KLALBConfig(){ + } + public static KLALBConfig getDefault(){ + KLALBConfig config=new KLALBConfig(); + config.add(new KLALBControllerConfigItem()); + return config; + } public static void main(String[] args) throws UnknownHostException, JsonSyntaxException, JsonIOException, FileNotFoundException { GsonBuilder gb=new GsonBuilder().setPrettyPrinting(); - MultipurposeSocketAddress.registerToGsonBuilder(gb); + MultiProtocolSocketAddress.registerToGsonBuilder(gb); KLALBConfigItem.registerToGsonBuilder(gb); Gson gson=gb.create(); KLALBConfig kc=gson.fromJson(new FileReader(new File("klalb-config.json")),KLALBConfig.class); diff --git a/src/org/kne/cloud/network/klalb/KLALBConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBConfigItem.java index 2ec5b02..8c5c787 100644 --- a/src/org/kne/cloud/network/klalb/KLALBConfigItem.java +++ b/src/org/kne/cloud/network/klalb/KLALBConfigItem.java @@ -1,22 +1,14 @@ 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; diff --git a/src/org/kne/cloud/network/klalb/KLALBController.java b/src/org/kne/cloud/network/klalb/KLALBController.java index 4ad7189..dd6a8e1 100644 --- a/src/org/kne/cloud/network/klalb/KLALBController.java +++ b/src/org/kne/cloud/network/klalb/KLALBController.java @@ -33,7 +33,7 @@ import java.util.function.Consumer; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.network.IPMulticastDiscovery; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.PortPair; import org.kne.cloud.network.SocketType; import org.kne.cloud.network.ThreadTool; @@ -67,7 +67,7 @@ public class KLALBController { public HighAccuracyClock getClock() { return clock; } - private final long TIME_WINDOW=5000000000L; + private final long TIME_WINDOW=2000000000L; private SpeedAndTrafficMonitorDataImpl linkMonitor = new SpeedAndTrafficMonitorDataImpl( new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100,TIME_WINDOW ), new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW)); @@ -76,8 +76,13 @@ public class KLALBController { new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "up", 100, TIME_WINDOW), new HashMapTimestampMonitor(HighAccuracyClock.SYSTEM_CLOCK, "down", 100, TIME_WINDOW)); - private List selflineTable = new ArrayList<>(); + private List selflineTable = new ArrayList<>(); + private List listensSocketAddress = new CopyOnWriteArrayList<>(); + + public List getListenSocketAddress() { + return listensSocketAddress; + } private static final boolean debug=false; private static final boolean showpacket = false; @@ -86,10 +91,12 @@ public class KLALBController { private static List ipmd = new ArrayList<>(); - private List networkInterfaceExcept = new ArrayList<>(); - + private NetworkInterfaceManager networkInterfaceManager=new NetworkInterfaceManager(); + public NetworkInterfaceManager getNetworkInterfaceManager() { + return networkInterfaceManager; + } public List getNetworkInterfaceExcept() { - return networkInterfaceExcept; + return networkInterfaceManager.getNetworkInterfaceExcept(); } private List dnsAddresses = new ArrayList<>(); @@ -111,50 +118,23 @@ public class KLALBController { private Timer twk = new Timer("网卡检测扫描计时器", true); - private List getAllNetworkInterfaceAddress() throws SocketException { - List addresses = new ArrayList(); - Enumeration eu = NetworkInterface.getNetworkInterfaces(); - while (eu.hasMoreElements()) { - NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); - if (networkInterface.getDisplayName() - .startsWith(CONST.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { - continue; - } - if (networkInterfaceExcept.contains(networkInterface)) { - continue; - } - if (networkInterface.isUp()) { - // System.out.println(networkInterface+" "+networkInterface.isUp()); - Enumeration ei = networkInterface.getInetAddresses(); - while (ei.hasMoreElements()) { - InetAddress inetAddress = (InetAddress) ei.nextElement(); - if (checkIsSelfLocator(inetAddress)) { - continue; - } - addresses.add(inetAddress); - } - } - } - return addresses; - } private TimerTask tsk1 = new TimerTask() { @Override public void run() { try { - List localaddress = getAllNetworkInterfaceAddress(); + List localaddress = networkInterfaceManager.getAllNetworkInterfaceAddress(); for (InetAddress inetAddress : localaddress) { - if (!inetAddress.isLoopbackAddress()) - for (Iterator iterator = listens.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress tcpl = (MultipurposeSocketAddress) iterator.next(); + for (Iterator iterator = listensSocketAddress.iterator(); iterator.hasNext();) { + MultiProtocolSocketAddress tcpl = (MultiProtocolSocketAddress) iterator.next(); try { if (tcpl.getInetAddress().isAnyLocalAddress() || tcpl.getInetAddress().equals(inetAddress)) { - MultipurposeSocketAddress bind = new MultipurposeSocketAddress(tcpl.getType(), + MultiProtocolSocketAddress bind = new MultiProtocolSocketAddress(tcpl.getProtocol(), inetAddress.getHostAddress(), tcpl.getPort()); // System.out.println(bind); synchronized (selflineTable) { @@ -175,46 +155,45 @@ public class KLALBController { try { - Set st = new HashSet<>(); - for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { - IPv6NetworkLink link = iterator.next(); - if (link instanceof KLALBRemoteLink) { - KLALBRemoteLink multipurposeSocketAddress = (KLALBRemoteLink) link; - if (multipurposeSocketAddress.getSocketAddress() != null) - st.add(multipurposeSocketAddress.getSocketAddress()); - } - } + Set st = new HashSet<>(); + for (IPv6NetworkLink link : srv6Router.getLinkTabel()) { + if (link instanceof KLALBRemoteLink) { + KLALBRemoteLink multipurposeSocketAddress = (KLALBRemoteLink) link; + if (multipurposeSocketAddress.getSocketAddress() != null) + st.add(multipurposeSocketAddress.getSocketAddress()); + } + } - for (Iterator iterator = st.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress target = (MultipurposeSocketAddress) iterator.next(); - addRemoteLines(target); - } - for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { - IPv6NetworkLink link = iterator.next(); - if (link instanceof KLALBRemoteLink) { - KLALBRemoteLink reml = (KLALBRemoteLink) link; - if (reml.getSocketAddress() != null) { - if (reml.getBindAddress() != null || reml.getRemoteVaddr() != null) - try { - MultipurposeSocketAddress iadr=reml.getBindAddress(); - if(iadr!=null) { - if (!localaddress.contains(iadr.getInetAddress())) { - reml.close(); - srv6Router.getLinkTabel().remove(reml); - } - }else { + for (MultiProtocolSocketAddress target : st) { + addRemoteLines(target); + } - reml.close(); - } - } catch (UnknownHostException e) { - reml.close(); - srv6Router.getLinkTabel().remove(reml); - e.printStackTrace(); - } - } - } - } + /* + for (IPv6NetworkLink link : srv6Router.getLinkTabel()) { + if (link instanceof KLALBRemoteLink) { + KLALBRemoteLink reml = (KLALBRemoteLink) link; + if (reml.getSocketAddress() != null) { + if (reml.getBindAddress() != null || reml.getRemoteVaddr() != null) + try { + MultipurposeSocketAddress iadr = reml.getBindAddress(); + if (iadr != null) { + if (!localaddress.contains(iadr.getInetAddress())) { + reml.close(); + srv6Router.getLinkTabel().remove(reml); + } + } else { + reml.close(); + } + } catch (UnknownHostException e) { + reml.close(); + srv6Router.getLinkTabel().remove(reml); + e.printStackTrace(); + } + } + } + } +*/ } finally { lineslock.writeLock().unlock(); } @@ -228,9 +207,9 @@ public class KLALBController { } private void updateBroadcastNetworkInterface() throws SocketException { - for (Iterator iterator = ipmd.iterator(); iterator.hasNext();) { + for (Iterator iterator = ipmd.iterator(); iterator.hasNext(); ) { IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next(); - if (ipMulticastDiscovery.isClosed() || (!ipMulticastDiscovery.getNinterface().isUp()) + if (ipMulticastDiscovery.isClosed() || (!ipMulticastDiscovery.getInterface().isUp()) || (configItem != null && configItem.isDenyLineTableBroadcast())) { iterator.remove(); try { @@ -238,99 +217,86 @@ public class KLALBController { } catch (IOException e) { e.printStackTrace(); } - if(debug) - System.out.println("关闭网卡地址广播:" + ipMulticastDiscovery.getNinterface()); + if (debug) + System.out.println("关闭网卡地址广播:" + ipMulticastDiscovery.getInterface()); } } if (configItem != null && configItem.isDenyLineTableBroadcast()) { } else { - Enumeration eu2 = NetworkInterface.getNetworkInterfaces(); - while (eu2.hasMoreElements()) { - NetworkInterface networkInterface = (NetworkInterface) eu2.nextElement(); - if (networkInterface.getDisplayName() - .startsWith(CONST.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { - continue; - } - - if (networkInterfaceExcept.contains(networkInterface)) { - continue; - } - - if (networkInterface.isUp()) { - - Enumeration ei = networkInterface.getInetAddresses(); - loop: while (ei.hasMoreElements()) { - InetAddress bidr = (InetAddress) ei.nextElement(); - if (checkIsSelfLocator(bidr)) { - continue; - } - for (Iterator iterator = ipmd.iterator(); iterator.hasNext();) { - IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next(); - if (networkInterface.equals(ipMulticastDiscovery.getNinterface()) - && bidr.equals(ipMulticastDiscovery.getBind().getAddress())) { - continue loop; - } - } - - try { - // InetAddress bidr=InetAddress.getByName("::0"); - - if (bidr instanceof Inet6Address) { - IPMulticastDiscovery ipd = new IPMulticastDiscovery( - new InetSocketAddress(bidr, DISCOVERY_PORT), - new InetSocketAddress(InetAddress.getByName("ff02::2486"), - DISCOVERY_PORT), - networkInterface, selflineTable, nodeuuid,10000L); - ipd.setCon((mpa) -> { - // System.out.println("添加本地IPv6链路:"+mpa); - try { - if (!checkIsSelf(mpa)) - addRemoteLines(mpa); - } catch (UnknownHostException e) { - } - }); - ipd.start(); - ipmd.add(ipd); - } else if (bidr instanceof Inet4Address) { - // bidr=InetAddress.getByName("0.0.0.0"); - IPMulticastDiscovery ipd2 = new IPMulticastDiscovery( - new InetSocketAddress(bidr, DISCOVERY_PORT), - new InetSocketAddress(InetAddress.getByName("224.0.0.86"), - DISCOVERY_PORT), - networkInterface, selflineTable,nodeuuid, 10000L); - ipd2.setCon((mpa) -> { - // System.out.println("添加本地IPv4链路:"+mpa); - try { - if (!checkIsSelf(mpa)) - addRemoteLines(mpa); - } catch (UnknownHostException e) { - } - }); - ipd2.start(); - ipmd.add(ipd2); - } - if(debug) - System.out.println("开启网卡地址广播:" + networkInterface); - } catch (BindException e) { - // e.printStackTrace(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } + List interfaceList = networkInterfaceManager.getAllAvaliableNetworkInterface(); + for(NetworkInterface networkInterface:interfaceList){ + List addressList= networkInterfaceManager.getNetworkInterfaceAddress(networkInterface); + loop:for (InetAddress bidr:addressList) { + for (IPMulticastDiscovery ipMulticastDiscovery : ipmd) { + if (networkInterface.equals(ipMulticastDiscovery.getInterface()) + && bidr.equals(ipMulticastDiscovery.getBind().getAddress())) { + continue loop; } - // } } - } + + try { + // InetAddress bidr=InetAddress.getByName("::0"); + + if (bidr instanceof Inet6Address) { + IPMulticastDiscovery ipd = new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), + new InetSocketAddress(InetAddress.getByName("ff02::2486"), + DISCOVERY_PORT), + networkInterface, listensSocketAddress, nodeuuid, 10000L); + ipd.setCon((mpa) -> { + if (debug) + System.out.println("添加本地IPv6链路:" + mpa); + try { + if (!checkIsSelf(mpa)) + addRemoteLines(mpa); + } catch (UnknownHostException e) { + } + }); + ipd.start(); + ipmd.add(ipd); + } else if (bidr instanceof Inet4Address) { + // bidr=InetAddress.getByName("0.0.0.0"); + IPMulticastDiscovery ipd2 = new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), + new InetSocketAddress(InetAddress.getByName("224.0.0.86"), + DISCOVERY_PORT), + networkInterface, listensSocketAddress, nodeuuid, 10000L); + ipd2.setCon((mpa) -> { + if (debug) + System.out.println("添加本地IPv4链路:" + mpa); + try { + if (!checkIsSelf(mpa)) + addRemoteLines(mpa); + } catch (UnknownHostException e) { + } + }); + ipd2.start(); + ipmd.add(ipd2); + } + if (debug) + System.out.println("开启网卡地址广播:" + networkInterface); + } catch (BindException e) { + // e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + + // } + + } + } + + } } }; - private boolean checkIsSelf(MultipurposeSocketAddress inetAddress) throws UnknownHostException { + private boolean checkIsSelf(MultiProtocolSocketAddress inetAddress) throws UnknownHostException { return inetAddress.getInetAddress().isAnyLocalAddress() || inetAddress.getInetAddress().isLoopbackAddress() || selflineTable.contains(inetAddress); @@ -345,16 +311,16 @@ public class KLALBController { @Override public void run() { - List nt = ntptable; + List nt = ntptable; // System.out.println("srv6 ip"+nb); if (nvc2 != null) { Set sp = nvc2.getPeers(); - for (MultipurposeSocketAddress server : nt) { + for (MultiProtocolSocketAddress server : nt) { sp.add(new NTPPeer(server, NTPv4Packet.NTP_CLIENT)); } sp.removeIf((p) -> { - for (MultipurposeSocketAddress server : nt) { + for (MultiProtocolSocketAddress server : nt) { if (server.equals(p.getAddress())) { return false; } @@ -365,33 +331,30 @@ public class KLALBController { } }; - private TimerTask tsk3 = new TimerTask() { - - @Override - public void run() { - if (srv6Router != null && routingProtocol != null) { - Set nb = srv6Router.getLocators(); - for (Iterator iterator = nb.iterator(); iterator.hasNext();) { - IPv6AddressGroup neighbor = (IPv6AddressGroup) iterator.next(); - try { - InetSocketAddress iaddr = new InetSocketAddress(neighbor.getAddress().toInet6Address(), - KLALBRoutingProtocol.DEFAULT_PORT); - apiClient.requestOpenLines(iaddr, (v) -> { - ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> { - for (MultipurposeSocketAddress msa : v) { - // System.out.print(msa); - addRemoteLines(msa); - } - }).start(); - }); - } catch (IOException e) { - e.printStackTrace(); - } - + public void tryConnectMore(){ + if (srv6Router != null && routingProtocol != null) { + Set nb = srv6Router.getLocators(); + for (Iterator iterator = nb.iterator(); iterator.hasNext();) { + IPv6AddressGroup neighbor = (IPv6AddressGroup) iterator.next(); + try { + InetSocketAddress iaddr = new InetSocketAddress(neighbor.getAddress().toInet6Address(), + KLALBRoutingProtocol.DEFAULT_PORT); + apiClient.requestOpenLines(iaddr, (v) -> { + ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> { + for (MultiProtocolSocketAddress msa : v) { + // System.out.print(msa); + addRemoteLines(msa); + } + }).start(); + }); + } catch (IOException e) { + e.printStackTrace(); } + } } - }; + } + public SpeedAndTrafficMonitorDataImpl getLinkMonitor() { return linkMonitor; @@ -403,6 +366,8 @@ public class KLALBController { private SocketType streamSocketType = new KLALBStreamSocketType(); + + public class KLALBStreamSocketType extends SocketType { public KLALBStreamSocketType() { @@ -436,7 +401,7 @@ public class KLALBController { } - public List getSelflineTable() { + public List getSelflineTable() { return selflineTable; } @@ -472,13 +437,13 @@ public class KLALBController { private KLALBControllerConfigItem configItem; - public void addRemoteLines(List select) { - for (MultipurposeSocketAddress target : select) { + public void addRemoteLines(List select) { + for (MultiProtocolSocketAddress target : select) { addRemoteLines(target); } } - public List addRemoteLines(MultipurposeSocketAddress target) { + public List addRemoteLines(MultiProtocolSocketAddress target) { lineslock.writeLock().lock(); try { List added = new ArrayList<>(); @@ -492,7 +457,7 @@ public class KLALBController { while (ei.hasMoreElements()) { InetAddress inetAddress = (InetAddress) ei.nextElement(); try { - MultipurposeSocketAddress bind = new MultipurposeSocketAddress( + MultiProtocolSocketAddress bind = new MultiProtocolSocketAddress( inetAddress.getHostAddress(), 0); try { if (target.getInetAddress().isLoopbackAddress() @@ -553,7 +518,7 @@ public class KLALBController { } } - public List removeRemoteLines(MultipurposeSocketAddress mpsa) { + public List removeRemoteLines(MultiProtocolSocketAddress mpsa) { List rmved = new ArrayList<>(); for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { @@ -569,7 +534,7 @@ public class KLALBController { return rmved; } - public Inet6Address getRemoteVaddrBySocketAddress(MultipurposeSocketAddress target) throws SocketTimeoutException { + public Inet6Address getRemoteVaddrBySocketAddress(MultiProtocolSocketAddress target) throws SocketTimeoutException { KLALBRemoteLink kr = null; for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { IPv6NetworkLink link = iterator.next(); @@ -593,7 +558,7 @@ public class KLALBController { return kr.getRemoteVaddr().getAddress().toInet6Address(); } - private boolean checkContainsTargetAndBind(MultipurposeSocketAddress target, MultipurposeSocketAddress bind) { + private boolean checkContainsTargetAndBind(MultiProtocolSocketAddress target, MultiProtocolSocketAddress bind) { boolean b = false; for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { IPv6NetworkLink link = iterator.next(); @@ -609,7 +574,7 @@ public class KLALBController { return b; } - private boolean checkContainsTarget(MultipurposeSocketAddress target) { + private boolean checkContainsTarget(MultiProtocolSocketAddress target) { boolean b = false; for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { IPv6NetworkLink link = iterator.next(); @@ -639,8 +604,8 @@ public class KLALBController { private String generateSelfLineTable() { StringBuilder sbd = new StringBuilder(); - for (Iterator iterator = selflineTable.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress klalbRemoteLine = (MultipurposeSocketAddress) iterator.next(); + for (Iterator iterator = selflineTable.iterator(); iterator.hasNext();) { + MultiProtocolSocketAddress klalbRemoteLine = (MultiProtocolSocketAddress) iterator.next(); sbd.append(klalbRemoteLine.toString()); sbd.append('\n'); } @@ -668,7 +633,11 @@ public class KLALBController { } private void loadSRv6ProtocolStack(IPv6AddressGroup selfx, boolean enableVirtualAdapter) { + networkInterfaceManager.getInetAddressesExcept().add(selfx.getAddress().toInet6Address()); srv6Router = new SRv6Router(selfx, clock); + if(configItem!=null) { + srv6Router.setPerformanceStrategy(PerformanceStrategy.fromDescription(configItem.getPerformanceStrategy())); + } srv6Router.runKLALBRouteProtocol(); routingProtocol = srv6Router.getKlalbRouteProtol(); routingProtocol.addReceiver((addr, packet) -> { @@ -715,7 +684,7 @@ public class KLALBController { // System.out.println(context); try { NTPv4Protocol nvc = new NTPv4Protocol(context, - new MultipurposeSocketAddress("{" + iproxyname + "_Datagram}0.0.0.0:123")); + new MultiProtocolSocketAddress(iproxyname + "_Datagram","0.0.0.0",123)); srv6Router.addSRv6RouterListener(new SRv6RouterListener() { @Override @@ -726,7 +695,7 @@ public class KLALBController { for (Neighbor neighbor : nb) { if (neighbor.getLocator() != null) sp.add(new NTPPeer( - new MultipurposeSocketAddress(iproxyname + "_Datagram", + new MultiProtocolSocketAddress(iproxyname + "_Datagram", neighbor.getLocator().getAddress().toString(), 123), NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); @@ -747,7 +716,7 @@ public class KLALBController { }); } }); - nvc2 = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:0"));// 106.55.184.199 + nvc2 = new NTPv4Protocol(context, new MultiProtocolSocketAddress("udp","0.0.0.0",0)); System.out.println(" Loaded: NTP Module"); } catch (UnknownHostException e) { @@ -764,7 +733,6 @@ public class KLALBController { this.apiClient = new KLALBRoutingProtocolAPIClient(routingProtocol); twk.schedule(tsk1, 5000, 5000); twk.schedule(tsk2, 5000, 5000); - twk.schedule(tsk3, 5000, 5000); } public KLALBController() { @@ -830,18 +798,18 @@ public class KLALBController { getIpv6Router().setASN(vasn); } - List linele = configItem.getLineTable(); + List linele = configItem.getLineTable(); if (linele != null) { getSelflineTable().addAll(linele); } - List linetoc = configItem.getConnectLineTable(); + List linetoc = configItem.getConnectLineTable(); if (linetoc != null) { linetoc.forEach((aline) -> { addRemoteLines(aline); }); } - List ntps = configItem.getNtpServerTable(); + List ntps = configItem.getNtpServerTable(); if (ntps != null) { getNTPTable().addAll(ntps); } @@ -1004,24 +972,19 @@ public class KLALBController { - private List listens = new CopyOnWriteArrayList<>(); public void registerToProxyTypeAs(String proxyname) { - MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Stream", streamSocketType); - MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Datagram", datagramSocketType); + MultiProtocolSocketAddress.getSocketTypeRegister().put(proxyname + "_Stream", streamSocketType); + MultiProtocolSocketAddress.getSocketTypeRegister().put(proxyname + "_Datagram", datagramSocketType); // ProxyProfileEntry.getRegister().put(proxyname, this); } - public List getListenSocketAddress() { - return listens; - } - - private List ntptable = new CopyOnWriteArrayList(); + private List ntptable = new CopyOnWriteArrayList(); private KLALBRoutingProtocol routingProtocol; - public List getNTPTable() { + public List getNTPTable() { return ntptable; } diff --git a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java index 0178a84..9b7966a 100644 --- a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java +++ b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java @@ -3,32 +3,42 @@ package org.kne.cloud.network.klalb; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; +import java.util.Objects; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; public class KLALBControllerConfigItem extends KLALBConfigItem { private String language; private boolean nogui; - private String VirtualAddress; + private String VirtualAddress=KLALBUtils.randomKLALBIPv6Address().toString(); private Long VirtualASN; private List DNS; - private MultipurposeSocketAddress TCPListen; - private MultipurposeSocketAddress UDPListen; + private MultiProtocolSocketAddress TCPListen=new MultiProtocolSocketAddress("0.0.0.0",4565); + private MultiProtocolSocketAddress UDPListen=new MultiProtocolSocketAddress("udp","0.0.0.0",4565); private String VirtualSocketName; - private ListLineTable=new ArrayList<>(); - private ListConnectLineTable=new ArrayList<>(); - private ListntpServerTable=new ArrayList<>(); + private ListLineTable=new ArrayList<>(); + private ListConnectLineTable=new ArrayList<>(); + private ListntpServerTable=new ArrayList<>(); private boolean denyLineTableQuery=false; private boolean denyLineTableBroadcast=false; private String congestionAlgorithm="BBR"; - private double burstLimit=1.20; + private double burstLimit=1.50; private double delayUpperBound=1.20; private double delayLowerBound=1.15; private long nagleDelayTime=1000000L; private long linkNagleDelayTime=1000000L; private int linkConnectionsCount=1; private String TUNName=CONST.KLALB_S_RV6; - + private String performanceStrategy="multifill"; + + public String getPerformanceStrategy() { + return performanceStrategy; + } + + public void setPerformanceStrategy(String performanceStrategy) { + this.performanceStrategy = performanceStrategy; + } + public void setNetworkInterfaceExcepts(List networkInterfaceExcepts) { NetworkInterfaceExcepts = networkInterfaceExcepts; } @@ -52,8 +62,8 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { - public KLALBControllerConfigItem(String type) { - super(type); + public KLALBControllerConfigItem() { + super("KLALBController"); } @@ -124,62 +134,62 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { - public MultipurposeSocketAddress getTCPListen() { + public MultiProtocolSocketAddress getTCPListen() { return TCPListen; } - public void setTCPListen(MultipurposeSocketAddress tCPListen) { + public void setTCPListen(MultiProtocolSocketAddress tCPListen) { TCPListen = tCPListen; } - public MultipurposeSocketAddress getUDPListen() { + public MultiProtocolSocketAddress getUDPListen() { return UDPListen; } - public void setUDPListen(MultipurposeSocketAddress uDPListen) { + public void setUDPListen(MultiProtocolSocketAddress uDPListen) { UDPListen = uDPListen; } - public List getLineTable() { + public List getLineTable() { return LineTable; } - public void setLineTable(List lineTable) { + public void setLineTable(List lineTable) { LineTable = lineTable; } - public List getConnectLineTable() { + public List getConnectLineTable() { return ConnectLineTable; } - public void setConnectLineTable(List connectLineTable) { + public void setConnectLineTable(List connectLineTable) { ConnectLineTable = connectLineTable; } - public List getNtpServerTable() { + public List getNtpServerTable() { return ntpServerTable; } - public void setNtpServerTable(List ntpServerTable) { + public void setNtpServerTable(List ntpServerTable) { this.ntpServerTable = ntpServerTable; } @@ -306,146 +316,43 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { @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 + ", ntpServerTable=" + ntpServerTable - + ", denyLineTableQuery=" + denyLineTableQuery + ", denyLineTableBroadcast=" + denyLineTableBroadcast - + ", congestionAlgorithm=" + congestionAlgorithm + ", delayUpperBound=" + delayUpperBound - + ", delayLowerBound=" + delayLowerBound + ", nagleDelayTime=" + nagleDelayTime - + ", linkNagleDelayTime=" + linkNagleDelayTime + ", linkConnectionsCount=" + linkConnectionsCount - + ", TUNName=" + TUNName + ", NetworkInterfaceExcepts=" + NetworkInterfaceExcepts + "]"; + return "KLALBControllerConfigItem{" + + "language='" + language + '\'' + + ", nogui=" + nogui + + ", VirtualAddress='" + VirtualAddress + '\'' + + ", VirtualASN=" + VirtualASN + + ", DNS=" + DNS + + ", TCPListen=" + TCPListen + + ", UDPListen=" + UDPListen + + ", VirtualSocketName='" + VirtualSocketName + '\'' + + ", LineTable=" + LineTable + + ", ConnectLineTable=" + ConnectLineTable + + ", ntpServerTable=" + ntpServerTable + + ", denyLineTableQuery=" + denyLineTableQuery + + ", denyLineTableBroadcast=" + denyLineTableBroadcast + + ", congestionAlgorithm='" + congestionAlgorithm + '\'' + + ", burstLimit=" + burstLimit + + ", delayUpperBound=" + delayUpperBound + + ", delayLowerBound=" + delayLowerBound + + ", nagleDelayTime=" + nagleDelayTime + + ", linkNagleDelayTime=" + linkNagleDelayTime + + ", linkConnectionsCount=" + linkConnectionsCount + + ", TUNName='" + TUNName + '\'' + + ", performanceStrategy='" + performanceStrategy + '\'' + + ", NetworkInterfaceExcepts=" + NetworkInterfaceExcepts + + '}'; } - + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + KLALBControllerConfigItem that = (KLALBControllerConfigItem) o; + return nogui == that.nogui && denyLineTableQuery == that.denyLineTableQuery && denyLineTableBroadcast == that.denyLineTableBroadcast && Double.compare(burstLimit, that.burstLimit) == 0 && Double.compare(delayUpperBound, that.delayUpperBound) == 0 && Double.compare(delayLowerBound, that.delayLowerBound) == 0 && nagleDelayTime == that.nagleDelayTime && linkNagleDelayTime == that.linkNagleDelayTime && linkConnectionsCount == that.linkConnectionsCount && Objects.equals(language, that.language) && Objects.equals(VirtualAddress, that.VirtualAddress) && Objects.equals(VirtualASN, that.VirtualASN) && Objects.equals(DNS, that.DNS) && Objects.equals(TCPListen, that.TCPListen) && Objects.equals(UDPListen, that.UDPListen) && Objects.equals(VirtualSocketName, that.VirtualSocketName) && Objects.equals(LineTable, that.LineTable) && Objects.equals(ConnectLineTable, that.ConnectLineTable) && Objects.equals(ntpServerTable, that.ntpServerTable) && Objects.equals(congestionAlgorithm, that.congestionAlgorithm) && Objects.equals(TUNName, that.TUNName) && Objects.equals(performanceStrategy, that.performanceStrategy) && Objects.equals(NetworkInterfaceExcepts, that.NetworkInterfaceExcepts); + } @Override public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((ConnectLineTable == null) ? 0 : ConnectLineTable.hashCode()); - result = prime * result + ((DNS == null) ? 0 : DNS.hashCode()); - result = prime * result + ((LineTable == null) ? 0 : LineTable.hashCode()); - result = prime * result + ((NetworkInterfaceExcepts == null) ? 0 : NetworkInterfaceExcepts.hashCode()); - result = prime * result + ((TCPListen == null) ? 0 : TCPListen.hashCode()); - result = prime * result + ((TUNName == null) ? 0 : TUNName.hashCode()); - result = prime * result + ((UDPListen == null) ? 0 : UDPListen.hashCode()); - result = prime * result + ((VirtualASN == null) ? 0 : VirtualASN.hashCode()); - result = prime * result + ((VirtualAddress == null) ? 0 : VirtualAddress.hashCode()); - result = prime * result + ((VirtualSocketName == null) ? 0 : VirtualSocketName.hashCode()); - result = prime * result + ((congestionAlgorithm == null) ? 0 : congestionAlgorithm.hashCode()); - long temp; - temp = Double.doubleToLongBits(delayLowerBound); - result = prime * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(delayUpperBound); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + (denyLineTableBroadcast ? 1231 : 1237); - result = prime * result + (denyLineTableQuery ? 1231 : 1237); - result = prime * result + ((language == null) ? 0 : language.hashCode()); - result = prime * result + linkConnectionsCount; - result = prime * result + (int) (linkNagleDelayTime ^ (linkNagleDelayTime >>> 32)); - result = prime * result + (int) (nagleDelayTime ^ (nagleDelayTime >>> 32)); - result = prime * result + (nogui ? 1231 : 1237); - result = prime * result + ((ntpServerTable == null) ? 0 : ntpServerTable.hashCode()); - return result; + return Objects.hash(super.hashCode(), language, nogui, VirtualAddress, VirtualASN, DNS, TCPListen, UDPListen, VirtualSocketName, LineTable, ConnectLineTable, ntpServerTable, denyLineTableQuery, denyLineTableBroadcast, congestionAlgorithm, burstLimit, delayUpperBound, delayLowerBound, nagleDelayTime, linkNagleDelayTime, linkConnectionsCount, TUNName, performanceStrategy, NetworkInterfaceExcepts); } - - - - @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; - if (ConnectLineTable == null) { - if (other.ConnectLineTable != null) - return false; - } else if (!ConnectLineTable.equals(other.ConnectLineTable)) - return false; - if (DNS == null) { - if (other.DNS != null) - return false; - } else if (!DNS.equals(other.DNS)) - return false; - if (LineTable == null) { - if (other.LineTable != null) - return false; - } else if (!LineTable.equals(other.LineTable)) - return false; - if (NetworkInterfaceExcepts == null) { - if (other.NetworkInterfaceExcepts != null) - return false; - } else if (!NetworkInterfaceExcepts.equals(other.NetworkInterfaceExcepts)) - return false; - if (TCPListen == null) { - if (other.TCPListen != null) - return false; - } else if (!TCPListen.equals(other.TCPListen)) - return false; - if (TUNName == null) { - if (other.TUNName != null) - return false; - } else if (!TUNName.equals(other.TUNName)) - return false; - if (UDPListen == null) { - if (other.UDPListen != null) - return false; - } else if (!UDPListen.equals(other.UDPListen)) - return false; - if (VirtualASN == null) { - if (other.VirtualASN != null) - return false; - } else if (!VirtualASN.equals(other.VirtualASN)) - return false; - if (VirtualAddress == null) { - if (other.VirtualAddress != null) - return false; - } else if (!VirtualAddress.equals(other.VirtualAddress)) - return false; - if (VirtualSocketName == null) { - if (other.VirtualSocketName != null) - return false; - } else if (!VirtualSocketName.equals(other.VirtualSocketName)) - return false; - if (congestionAlgorithm == null) { - if (other.congestionAlgorithm != null) - return false; - } else if (!congestionAlgorithm.equals(other.congestionAlgorithm)) - return false; - if (Double.doubleToLongBits(delayLowerBound) != Double.doubleToLongBits(other.delayLowerBound)) - return false; - if (Double.doubleToLongBits(delayUpperBound) != Double.doubleToLongBits(other.delayUpperBound)) - return false; - if (denyLineTableBroadcast != other.denyLineTableBroadcast) - return false; - if (denyLineTableQuery != other.denyLineTableQuery) - return false; - if (language == null) { - if (other.language != null) - return false; - } else if (!language.equals(other.language)) - return false; - if (linkConnectionsCount != other.linkConnectionsCount) - return false; - if (linkNagleDelayTime != other.linkNagleDelayTime) - return false; - if (nagleDelayTime != other.nagleDelayTime) - return false; - if (nogui != other.nogui) - return false; - if (ntpServerTable == null) { - if (other.ntpServerTable != null) - return false; - } else if (!ntpServerTable.equals(other.ntpServerTable)) - return false; - return true; - } - - - - } diff --git a/src/org/kne/cloud/network/klalb/KLALBMain.java b/src/org/kne/cloud/network/klalb/KLALBMain.java index ba10b7e..a3e9f66 100644 --- a/src/org/kne/cloud/network/klalb/KLALBMain.java +++ b/src/org/kne/cloud/network/klalb/KLALBMain.java @@ -2,7 +2,9 @@ package org.kne.cloud.network.klalb; import java.io.File; import java.io.IOException; +import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.NetworkInterface; import java.nio.channels.ServerSocketChannel; import java.util.ArrayList; import java.util.Collections; @@ -11,7 +13,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Scanner; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.SocketChannelListener; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.ipv6.RouteItem; @@ -87,6 +89,7 @@ public class KLALBMain { System.out.println(" links-remove : remove link"); System.out.println(" links-reconnect: reconnect all link"); System.out.println(" kltp-state: query kltp states"); + System.out.println(" interfaces: show all network interfaces"); System.out.println(" route: display internal route table"); System.out.println(" kperf : performance benchmark"); System.out.println(" exit: Exit"); @@ -115,7 +118,7 @@ public class KLALBMain { break; case "links-add": if(sc.length>=2) { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]); + MultiProtocolSocketAddress mpsa=new MultiProtocolSocketAddress(sc[1]); Listaddl=kpcje.getKlalbController().addRemoteLines(mpsa); if(addl.isEmpty()) { //System.out.println("添加失败,线路已存在!"); @@ -135,7 +138,7 @@ public class KLALBMain { break; case "links-remove": if(sc.length>=2) { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]); + MultiProtocolSocketAddress mpsa=new MultiProtocolSocketAddress(sc[1]); Listrmvl=kpcje.getKlalbController().removeRemoteLines(mpsa); if(rmvl.isEmpty()) { System.out.println("No matched link has been found."); @@ -161,6 +164,18 @@ public class KLALBMain { case "kltp-state": System.out.println(kpcje.getKlalbController().getKLTPregister().toString()); break; + case "interfaces": + NetworkInterfaceManager networkInterfaceManager= kpcje.getKlalbController().getNetworkInterfaceManager(); + List interfaceList=networkInterfaceManager.getAllAvaliableNetworkInterface(); + System.out.println("Network interface detected:"); + for(NetworkInterface networkInterface:interfaceList){ + System.out.println(networkInterface.getName()+"("+networkInterface.getDisplayName()+")"); + List lst= networkInterfaceManager.getNetworkInterfaceAddress(networkInterface); + for(InetAddress address :lst){ + System.out.println(" "+address.getHostAddress()); + } + } + break; case "route": List lri=new ArrayList<>( kpcje.getKlalbController().getIpv6Router().getCurrentRouteTabel()); Collections.sort(lri); @@ -174,7 +189,7 @@ public class KLALBMain { break; case "kperf": if(sc.length>=2) { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]); + MultiProtocolSocketAddress mpsa=new MultiProtocolSocketAddress(sc[1]); Kperf kp=new Kperf(mpsa); kp.startPerfing(); }else { diff --git a/src/org/kne/cloud/network/klalb/KLALBPacketLink.java b/src/org/kne/cloud/network/klalb/KLALBPacketLink.java index 87d05b4..e0f8c4f 100644 --- a/src/org/kne/cloud/network/klalb/KLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/KLALBPacketLink.java @@ -2,12 +2,6 @@ package org.kne.cloud.network.klalb; import java.io.IOException; import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.LongAdder; - -import org.kne.cloud.network.MultipurposeSocketAddress; public interface KLALBPacketLink { public void writeKLALBPacket(KLALBPacket kp) throws IOException; diff --git a/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java b/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java index 55a92e2..e6fe461 100644 --- a/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java +++ b/src/org/kne/cloud/network/klalb/KLALBProtocolDetectSocketListener.java @@ -7,7 +7,7 @@ import java.net.UnknownHostException; import java.util.function.Consumer; import org.kne.cloud.network.KLALBDetectorItem; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ProtocolDetector; import org.kne.cloud.network.ProtocolDetectorServerSocket; import org.kne.cloud.network.ProtocolDetectorSocket; @@ -30,8 +30,8 @@ public class KLALBProtocolDetectSocketListener extends SocketListener { super.open(); } - public KLALBProtocolDetectSocketListener(MultipurposeSocketAddress multipurposeSocketAddress,KLALBController klalbc) throws IOException { - super(multipurposeSocketAddress); + public KLALBProtocolDetectSocketListener(MultiProtocolSocketAddress multiProtocolSocketAddress, KLALBController klalbc) throws IOException { + super(multiProtocolSocketAddress); this.klalbController=klalbc; } diff --git a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java index dadba00..d1200ef 100644 --- a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java +++ b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java @@ -29,7 +29,7 @@ public class KLALBProxySystem { private File jsonFile; { GsonBuilder gb=new GsonBuilder().setPrettyPrinting(); - MultipurposeSocketAddress.registerToGsonBuilder(gb); + MultiProtocolSocketAddress.registerToGsonBuilder(gb); KLALBConfigItem.registerToGsonBuilder(gb); gson=gb.create(); } @@ -63,7 +63,7 @@ public class KLALBProxySystem { } } - public void enableRemoteManagement(MultipurposeSocketAddress bind) throws IOException { + public void enableRemoteManagement(MultiProtocolSocketAddress bind) throws IOException { if(krm==null) { krm=new KLALBRemoteManagement(this,bind); }else { @@ -84,13 +84,17 @@ public class KLALBProxySystem { public void loadConfigJson(File jsonFile) throws IOException { this.jsonFile=jsonFile; - FileReader fr = null; - try { - fr=new FileReader(jsonFile); - loadConfigJson(fr); - }finally { - if(fr!=null) - fr.close(); + if(jsonFile.exists()) { + FileReader fr = null; + try { + fr = new FileReader(jsonFile); + loadConfigJson(fr); + } finally { + if (fr != null) + fr.close(); + } + }else{ + loadConfig(KLALBConfig.getDefault()); } } @@ -128,9 +132,9 @@ public class KLALBProxySystem { String vsne=kcci.getVirtualSocketName(); //if(vsne!=null) { - MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getStreamSocketType()); + MultiProtocolSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getStreamSocketType()); //} - MultipurposeSocketAddress tcple=kcci.getTCPListen(); + MultiProtocolSocketAddress tcple=kcci.getTCPListen(); if(tcple!=null) { SocketChannelListener tcpl = null; @@ -148,13 +152,13 @@ public class KLALBProxySystem { } }); - MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(tcple.getType(), tcple.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort()); + MultiProtocolSocketAddress mpsa2=new MultiProtocolSocketAddress(tcple.getProtocol(), tcple.getHost(),((InetSocketAddress)tcpl.getServerSocketChannel().getLocalAddress()).getPort()); klalbController.getListenSocketAddress().add(mpsa2); } catch (IOException e1) { e1.printStackTrace(); } } - MultipurposeSocketAddress udple=kcci.getUDPListen(); + MultiProtocolSocketAddress udple=kcci.getUDPListen(); if(udple!=null) { DatagramSocketListener udpl = null; try { @@ -171,7 +175,7 @@ public class KLALBProxySystem { } }); - MultipurposeSocketAddress mpsau2=new MultipurposeSocketAddress(udple.getType(), udple.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort()); + MultiProtocolSocketAddress mpsau2=new MultiProtocolSocketAddress(udple.getProtocol(), udple.getHost(),((InetSocketAddress)(udpl.getDatagramServerSocket().getLocalSocketAddress())).getPort()); //klalbController.getListenSocketAddress().add(mpsau2); } catch (IOException e1) { e1.printStackTrace(); diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java index 9f8f51b..3bc8617 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteLink.java @@ -2,6 +2,9 @@ package org.kne.cloud.network.klalb; import java.io.IOException; import java.io.StreamCorruptedException; +import java.net.BindException; +import java.net.NoRouteToHostException; +import java.net.SocketException; import java.net.SocketTimeoutException; import java.nio.channels.UnresolvedAddressException; import java.security.SecureRandom; @@ -21,7 +24,7 @@ import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.clock.NTPTimestamps; import org.kne.cloud.clock.ReliabilityBackoffTimeClock; import org.kne.cloud.clock.WatchDogTimer; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.congestion.BBRCongestionAlgorithm; import org.kne.cloud.network.congestion.CongestionAlgorithm; @@ -100,8 +103,8 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement private LinkStatus status=new LinkStatus(); private SpeedAndTrafficAndDelayMonitorDataImpl monitor; private volatile KLALBPacketLink kplink; - private MultipurposeSocketAddress bindAddress; - private MultipurposeSocketAddress socketAddress; + private MultiProtocolSocketAddress bindAddress; + private MultiProtocolSocketAddress socketAddress; public void setKplink(KLALBPacketLink kplink) { @@ -112,11 +115,11 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement return kplink; } - public MultipurposeSocketAddress getSocketAddress() { + public MultiProtocolSocketAddress getSocketAddress() { return socketAddress; } - public MultipurposeSocketAddress getBindAddress() { + public MultiProtocolSocketAddress getBindAddress() { return bindAddress; } @@ -134,7 +137,7 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement return peerAddress; } - public KLALBRemoteLink(KLALBController controller, MultipurposeSocketAddress mpa, IPv6AddressGroup address) { + public KLALBRemoteLink(KLALBController controller, MultiProtocolSocketAddress mpa, IPv6AddressGroup address) { this(controller,mpa, null,address); } @@ -147,7 +150,7 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement name=kpl.toString(); } - private KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, IPv6AddressGroup address) { + private KLALBRemoteLink(KLALBController controller, MultiProtocolSocketAddress mpa, MultiProtocolSocketAddress bindaddr, IPv6AddressGroup address) { this.klalbController=controller; sysclk = klalbController.getClock(); this.socketAddress = mpa; @@ -162,11 +165,11 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement } - public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa, MultipurposeSocketAddress bind) { + public KLALBRemoteLink(KLALBController controller, MultiProtocolSocketAddress mpa, MultiProtocolSocketAddress bind) { this(controller,mpa, bind, null); } - public KLALBRemoteLink(KLALBController controller,MultipurposeSocketAddress mpa) { + public KLALBRemoteLink(KLALBController controller, MultiProtocolSocketAddress mpa) { this(controller,mpa, (IPv6AddressGroup) null); } @@ -283,7 +286,7 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement sendLock.unlock(); } } - tlock.parkNanos(1000000L); + tlock.parkNanos(10000000L); } } catch (StreamCorruptedException sce) { @@ -569,7 +572,9 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement public void run() { while (!closed) { status.updateReliability(); - monitor.update(); + if(status.getState()!=LinkStatus.DOWN) { + monitor.update(); + } try { Thread.sleep(1); } catch (InterruptedException e) { @@ -579,7 +584,7 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement } } - + } private RemoteSender sender; private RemoteReceiver receiver; @@ -674,7 +679,23 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement } } catch (StreamCorruptedException sce) { sce.printStackTrace(); - } catch (IOException | UnresolvedAddressException e) { + }catch(BindException e) { + close(); + if (debug) + e.printStackTrace(); + }catch(NoRouteToHostException e){ + close(); + if (debug) + e.printStackTrace(); + } catch(SocketException e) { + String massage = e.getMessage(); + if (massage.toLowerCase().contains("unreachable")) { + close(); + } else { + if (debug) + e.printStackTrace(); + } + }catch (IOException | UnresolvedAddressException e) { if (debug) e.printStackTrace(); } catch (Exception e) { @@ -929,23 +950,25 @@ public class KLALBRemoteLink extends AbstractControlledIPv6NetworkLink implement public List getRouteItems() { List rlist = new ArrayList<>(); + if(isUp()) { IPv6AddressGroup adg = addressGroup; /*if (adg != null) rlist.add(new RouteItem(new IPv6AddressGroup(adg.getAddress(), 128), adg.getAddress(), this, "Direct", 0, 0, null, "D", true));*/ - for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) { + for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext(); ) { Neighbor addresses = (Neighbor) iteratorx.next(); RouteItem ri = new RouteItem(new IPv6AddressGroup(addresses.getAddress().getAddress(), 128), - addresses.getAddress().getAddress(), this, "Direct", 0, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false); + addresses.getAddress().getAddress(), this, "Direct", 0, 128, CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(), status, algorithm::getRTO), "D", false); rlist.add(ri); if (addresses.getLocator() != null) { RouteItem ris = new RouteItem(addresses.getLocator(), addresses.getLocator().getAddress(), this, - "KLALB SRv6", 13, 128,CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(),status,algorithm::getRTO), "D", false); + "KLALB SRv6", 13, 128, CostSupplierFactory.expectedDelaySupplier((DelayMonitorData) addresses.getMonitor(), status, algorithm::getRTO), "D", false); rlist.add(ris); } } + } return rlist; } diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java index 34fcf96..56b6555 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java @@ -6,7 +6,7 @@ import java.nio.charset.Charset; import java.util.Iterator; import java.util.List; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.SocketListener; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.monitor.LinkStatus; @@ -20,9 +20,9 @@ public class KLALBRemoteManagement { SocketListener slr; private KLALBProxySystem klalbProxySystem; public KLALBRemoteManagement(KLALBProxySystem klalbProxySystem) throws IOException { - this(klalbProxySystem,new MultipurposeSocketAddress("127.9.9.9", 49573)); + this(klalbProxySystem,new MultiProtocolSocketAddress("127.9.9.9", 49573)); } - public KLALBRemoteManagement(KLALBProxySystem klalbProxySystem,MultipurposeSocketAddress listen) throws IOException { + public KLALBRemoteManagement(KLALBProxySystem klalbProxySystem, MultiProtocolSocketAddress listen) throws IOException { this.klalbProxySystem=klalbProxySystem; slr=new SocketListener(listen); slr.setCon((srcv)->{ @@ -97,18 +97,18 @@ public class KLALBRemoteManagement { String mip=jreq.getAsJsonPrimitive("ipport").getAsString(); try { - jrsp.addProperty ("Vaddr",klalbProxySystem.getKlalbController().getRemoteVaddrBySocketAddress(new MultipurposeSocketAddress(mip)).getHostAddress()); + jrsp.addProperty ("Vaddr",klalbProxySystem.getKlalbController().getRemoteVaddrBySocketAddress(new MultiProtocolSocketAddress(mip)).getHostAddress()); } catch (SocketTimeoutException e) { e.printStackTrace(); } break; case "GETSELFLINES": JsonArray lines2=new JsonArray(); - Listselflineslist=klalbProxySystem.getKlalbController().getSelflineTable(); + Listselflineslist=klalbProxySystem.getKlalbController().getSelflineTable(); synchronized (selflineslist) { - for (Iterator iterator = selflineslist.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress multipurposeSocketAddress = (MultipurposeSocketAddress) iterator.next(); - lines2.add(new JsonPrimitive(multipurposeSocketAddress.toString())); + for (Iterator iterator = selflineslist.iterator(); iterator.hasNext();) { + MultiProtocolSocketAddress multiProtocolSocketAddress = (MultiProtocolSocketAddress) iterator.next(); + lines2.add(new JsonPrimitive(multiProtocolSocketAddress.toString())); } } jrsp.add("table", lines2); @@ -116,16 +116,16 @@ public class KLALBRemoteManagement { break; case "ADDSELFLINE": String mips=jreq.getAsJsonPrimitive("ipport").getAsString(); - Listselflineslist2=klalbProxySystem.getKlalbController().getSelflineTable(); + Listselflineslist2=klalbProxySystem.getKlalbController().getSelflineTable(); synchronized (selflineslist2) { - selflineslist2.add(new MultipurposeSocketAddress(mips)); + selflineslist2.add(new MultiProtocolSocketAddress(mips)); } break; case "REMOVESELFLINE": String mipsr=jreq.getAsJsonPrimitive("ipport").getAsString(); - Listselflineslist21=klalbProxySystem.getKlalbController().getSelflineTable(); + Listselflineslist21=klalbProxySystem.getKlalbController().getSelflineTable(); synchronized (selflineslist21) { - selflineslist21.add(new MultipurposeSocketAddress(mipsr)); + selflineslist21.add(new MultiProtocolSocketAddress(mipsr)); } break; case "GETLINKMONITOR": diff --git a/src/org/kne/cloud/network/klalb/KLALBUtils.java b/src/org/kne/cloud/network/klalb/KLALBUtils.java index fdacab2..1bedf45 100644 --- a/src/org/kne/cloud/network/klalb/KLALBUtils.java +++ b/src/org/kne/cloud/network/klalb/KLALBUtils.java @@ -15,7 +15,7 @@ import java.util.regex.Pattern; import org.jctools.counters.CountersFactory; import org.jctools.counters.FixedSizeStripedLongCounter; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ipv6.IPv6Address; public class KLALBUtils { @@ -208,7 +208,7 @@ public class KLALBUtils { return col; } - public static KLALBPacketLink createKLALBPacketLink(MultipurposeSocketAddress bindAddress, MultipurposeSocketAddress targetAddress,boolean buffered) + public static KLALBPacketLink createKLALBPacketLink(MultiProtocolSocketAddress bindAddress, MultiProtocolSocketAddress targetAddress, boolean buffered) throws IOException { if (targetAddress.isStream()) { if (targetAddress.supportNIO()) { @@ -235,8 +235,8 @@ public class KLALBUtils { } } } - public static KLALBPacketLink createKLALBPacketLink(MultipurposeSocketAddress bindAddress, - MultipurposeSocketAddress targetAddress,boolean buffered, int timeout) throws UnknownHostException, IOException { + public static KLALBPacketLink createKLALBPacketLink(MultiProtocolSocketAddress bindAddress, + MultiProtocolSocketAddress targetAddress, boolean buffered, int timeout) throws UnknownHostException, IOException { if (targetAddress.isStream()) { if (targetAddress.supportNIO()) { if (bindAddress != null) { diff --git a/src/org/kne/cloud/network/klalb/NetworkInterfaceManager.java b/src/org/kne/cloud/network/klalb/NetworkInterfaceManager.java new file mode 100644 index 0000000..ed51901 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/NetworkInterfaceManager.java @@ -0,0 +1,71 @@ +package org.kne.cloud.network.klalb; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +public class NetworkInterfaceManager { + private List networkInterfaceExcept = new ArrayList<>(); + private List inetAddressesExcept = new ArrayList<>(); + + public List getNetworkInterfaceExcept() { + return networkInterfaceExcept; + } + + + public List getInetAddressesExcept() { + return inetAddressesExcept; + } + + public List getAllAvaliableNetworkInterface() throws SocketException { + List interfaces = new ArrayList(); + Enumeration eu = NetworkInterface.getNetworkInterfaces(); + while (eu.hasMoreElements()) { + NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); + + if (networkInterface.getDisplayName() + .startsWith(CONST.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { + continue; + } + if (networkInterfaceExcept.contains(networkInterface)) { + continue; + } + if (networkInterface.isUp()) { + interfaces.add(networkInterface); + } + } + return interfaces; + } + + public List getAllNetworkInterfaceAddress() throws SocketException { + List interfaces=getAllAvaliableNetworkInterface(); + List addresses = new ArrayList(); + for (NetworkInterface nif:interfaces){ + addresses.addAll( getNetworkInterfaceAddress(nif)); + } + return addresses; + } + + public List getNetworkInterfaceAddress(NetworkInterface networkInterface) throws SocketException { + List addresses = new ArrayList(); + // System.out.println(networkInterface+" "+networkInterface.isUp()); + Enumeration ei = networkInterface.getInetAddresses(); + while (ei.hasMoreElements()) { + InetAddress inetAddress = (InetAddress) ei.nextElement(); + + if (inetAddress.isLoopbackAddress()){ + continue; + } + if (inetAddressesExcept.contains( inetAddress)) { + continue; + } + addresses.add(inetAddress); + } + + return addresses; + } + +} diff --git a/src/org/kne/cloud/network/klalb/PerformanceStrategy.java b/src/org/kne/cloud/network/klalb/PerformanceStrategy.java new file mode 100644 index 0000000..adbfa72 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/PerformanceStrategy.java @@ -0,0 +1,35 @@ +package org.kne.cloud.network.klalb; + +import org.kne.cloud.network.klalb.ui.UIEnv; + +public enum PerformanceStrategy { + SINGLE_CORE("singlecore"), + MULTI_FILL("multifill"), + MULTI_SCATTER("multiscatter"); + + private String description; + + private PerformanceStrategy(String description) { + this.description = description; + } + + @Override + public String toString() { + return description; + } + + /** + * 根据 description 查找对应的枚举对象。 + * + * @param description 描述文本(资源包key) + * @return 对应的枚举对象 + */ + public static PerformanceStrategy fromDescription(String description) { + for (PerformanceStrategy strategy : values()) { + if (strategy.description.equals(description)) { + return strategy; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java b/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java index ded6ecd..2de0cef 100644 --- a/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java +++ b/src/org/kne/cloud/network/klalb/SocketBridgeConfigItem.java @@ -1,40 +1,23 @@ 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.MultiProtocolSocketAddress; 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 MultiProtocolSocketAddress Listen; private LinkedHashMapBridge=new LinkedHashMap<>(); private HostPortMap Connect=new HostPortMap(); - public SocketBridgeConfigItem( MultipurposeSocketAddress listen, + public SocketBridgeConfigItem( MultiProtocolSocketAddress listen, LinkedHashMap bridge, HostPortMap connect) { super("SocketBridge"); Listen = listen; @@ -85,12 +68,12 @@ public class SocketBridgeConfigItem extends KLALBConfigItem { public Proxy createProxy(KLALBController controller) throws IOException { HostPortMap mapp=new HostPortMap(); LinkedHashMapmapb=new LinkedHashMap<>(); - MultipurposeSocketAddress l=Listen; + MultiProtocolSocketAddress 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); + MultiProtocolSocketAddress r=getDefaultConnect(Connect,mapp); + return new SocketToSocketProxy(l ,new MultiProtocolSocketAddress("0.0.0.0:0"), r,mapp,bdg,mapb); } - private MultipurposeSocketAddress getDefaultConnect(HostPortMap connect2, LinkedHashMap mapp) { + private MultiProtocolSocketAddress getDefaultConnect(HostPortMap connect2, LinkedHashMap mapp) { connect2.entrySet().forEach((en)->{ mapp.put(en.getKey(), en.getValue()); }); diff --git a/src/org/kne/cloud/network/klalb/SplitedDatagramKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/SplitedDatagramKLALBPacketLink.java index fecc042..845f034 100644 --- a/src/org/kne/cloud/network/klalb/SplitedDatagramKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/SplitedDatagramKLALBPacketLink.java @@ -116,29 +116,20 @@ public class DatagramKLALBPacketLink implements KLALBPacketLink { }*/ package org.kne.cloud.network.klalb; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import java.nio.ByteBuffer; -import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; -import java.util.concurrent.atomic.AtomicLong; -import org.kne.cloud.network.DatagramServerSocket; import org.kne.cloud.network.DatagramServerSocket.SubDatagramSocket; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.PacketRebuilder; import org.kne.cloud.network.PacketSpliter; -import org.kne.cloud.network.SpeedLimiter; -import org.kne.debug.TimeDebugger; public class SplitedDatagramKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink { private PacketSpliter pslr; @@ -146,7 +137,7 @@ public class SplitedDatagramKLALBPacketLink extends AbstractKLALBPacketLink impl @Override public String toString() { - return new MultipurposeSocketAddress("UDP",(InetSocketAddress)ds.getLocalSocketAddress())+"←"+new MultipurposeSocketAddress("UDP",(InetSocketAddress)ds.getRemoteSocketAddress()); + return new MultiProtocolSocketAddress("UDP",(InetSocketAddress)ds.getLocalSocketAddress())+"←"+new MultiProtocolSocketAddress("UDP",(InetSocketAddress)ds.getRemoteSocketAddress()); } private DatagramSocket ds; diff --git a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java index 405dd65..f3ac804 100644 --- a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java @@ -13,7 +13,7 @@ import java.nio.channels.SocketChannel; import java.util.concurrent.atomic.AtomicLong; import org.kne.cloud.network.BufferedChannel; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.ThreadTool; import org.kne.io.KNEChannels; @@ -45,7 +45,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem @Override public String toString() { try { - return new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getLocalAddress())+"←"+new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getRemoteAddress()); + return new MultiProtocolSocketAddress((InetSocketAddress)connectSocket.getLocalAddress())+"←"+new MultiProtocolSocketAddress((InetSocketAddress)connectSocket.getRemoteAddress()); } catch (Exception e) { e.printStackTrace(); return "?←?"; diff --git a/src/org/kne/cloud/network/klalb/StreamKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/StreamKLALBPacketLink.java index 82daf64..3bd0029 100644 --- a/src/org/kne/cloud/network/klalb/StreamKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/StreamKLALBPacketLink.java @@ -1,21 +1,18 @@ package org.kne.cloud.network.klalb; -import java.io.BufferedOutputStream; import java.io.IOException; -import java.io.InputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketException; -import java.nio.Buffer; import java.nio.ByteBuffer; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; public class StreamKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink { @Override public String toString() { - return new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getLocalSocketAddress())+"←"+new MultipurposeSocketAddress("TCP",(InetSocketAddress)connectSocket.getRemoteSocketAddress()); + return new MultiProtocolSocketAddress((InetSocketAddress)connectSocket.getLocalSocketAddress())+"←"+new MultiProtocolSocketAddress((InetSocketAddress)connectSocket.getRemoteSocketAddress()); } private Socket connectSocket; diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java index 9a197b4..69cb3ea 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java @@ -20,7 +20,7 @@ import org.jfree.chart.plot.dial.*; import org.jfree.data.general.DefaultValueDataset; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.klalb.uitool.*; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ipv6.IPv6Address; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.klalb.*; @@ -80,7 +80,7 @@ public class KLALBStateGUI3 extends XFrame { private JTextField textFieldLocate; // 定位地址输入框 private JTextField asnField2; // ASN显示框 private JTextArea dnsAreaSet; // DNS服务器设置区域 - private JComboBox comboPerformance; // 性能策略选择框 + private JComboBox comboPerformance; // 性能策略选择框 private JComboBox comboCongestion; // 拥塞控制算法选择框 private JTextField tcpListeningSet; // TCP监听设置 private JTextField udpListeningSet; // UDP监听设置 @@ -597,7 +597,7 @@ public class KLALBStateGUI3 extends XFrame { JButton btnNewButton = new JButton(UIEnv.getRsb().getString("addline")); btnNewButton.addActionListener(e -> { try { - MultipurposeSocketAddress mpsa= new MultipurposeSocketAddress(textField.getText()); + MultiProtocolSocketAddress mpsa= new MultiProtocolSocketAddress(textField.getText()); Thread t=new Thread(()->{ kc.addRemoteLines(mpsa); }); @@ -892,8 +892,10 @@ public class KLALBStateGUI3 extends XFrame { performanceStrategy = new ComboSettingItem(UIEnv.getRsb().getString("performancestrategy"), CONST.itemwidth, CONST.settingheight); comboPerformance = performanceStrategy.getComboBox(); - comboPerformance.addItem("1"); - comboPerformance.addItem("2"); + comboPerformance.addItem(new PerformanceStrategyItem(PerformanceStrategy.SINGLE_CORE)); + comboPerformance.addItem(new PerformanceStrategyItem(PerformanceStrategy.MULTI_FILL)); + comboPerformance.addItem(new PerformanceStrategyItem(PerformanceStrategy.MULTI_SCATTER)); + comboPerformance.setSelectedIndex(1); settings.getView().add(performanceStrategy); @@ -1008,7 +1010,7 @@ public class KLALBStateGUI3 extends XFrame { private void saveConfig() { if (config == null) { config = new KLALBConfig(); - config.add(new KLALBControllerConfigItem("KLALBController")); + config.add(new KLALBControllerConfigItem()); } for (KLALBConfigItem item : config) { @@ -1084,7 +1086,7 @@ public class KLALBStateGUI3 extends XFrame { kck.setTCPListen(null); } else { try { - kck.setTCPListen(new MultipurposeSocketAddress(tcptext)); + kck.setTCPListen(new MultiProtocolSocketAddress(tcptext)); } catch (RuntimeException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, UIEnv.getRsb().getString("invaildtcplisten"), @@ -1099,7 +1101,7 @@ public class KLALBStateGUI3 extends XFrame { kck.setUDPListen(null); } else { try { - kck.setUDPListen(new MultipurposeSocketAddress(udptext)); + kck.setUDPListen(new MultiProtocolSocketAddress(udptext)); } catch (RuntimeException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, UIEnv.getRsb().getString("invaildudplisten"), @@ -1110,13 +1112,13 @@ public class KLALBStateGUI3 extends XFrame { // 保存开放线路表 String[] splt1 = openLineTabelSet.getText().split("\n"); - List iaddr1 = new ArrayList<>(); + List iaddr1 = new ArrayList<>(); boolean show1 = true; for (String str : splt1) { try { str = str.trim(); if (!str.isEmpty()) - iaddr1.add(new MultipurposeSocketAddress(str)); + iaddr1.add(new MultiProtocolSocketAddress(str)); } catch (RuntimeException e) { e.printStackTrace(); if (show1) { @@ -1131,13 +1133,13 @@ public class KLALBStateGUI3 extends XFrame { // 保存自动连接线路表 String[] splt11 = connectLineTabelSet.getText().split("\n"); - List iaddr11 = new ArrayList<>(); + List iaddr11 = new ArrayList<>(); boolean show11 = true; for (String str : splt11) { try { str = str.trim(); if (!str.isEmpty()) - iaddr11.add(new MultipurposeSocketAddress(str)); + iaddr11.add(new MultiProtocolSocketAddress(str)); } catch (RuntimeException e) { e.printStackTrace(); if (show11) { @@ -1152,13 +1154,13 @@ public class KLALBStateGUI3 extends XFrame { // 保存NTP服务器表 String[] splt111 = ntpServerSet.getText().split("\n"); - List iaddr111 = new ArrayList<>(); + List iaddr111 = new ArrayList<>(); boolean show111 = true; for (String str : splt111) { try { str = str.trim(); if (!str.isEmpty()) - iaddr111.add(new MultipurposeSocketAddress(str)); + iaddr111.add(new MultiProtocolSocketAddress(str)); } catch (RuntimeException e) { e.printStackTrace(); if (show111) { @@ -1183,7 +1185,12 @@ public class KLALBStateGUI3 extends XFrame { kck.setDenyLineTableQuery(denyQuery.isSelected()); kck.setDenyLineTableBroadcast(denyBroadcast.isSelected()); - + + PerformanceStrategyItem psi=((PerformanceStrategyItem)comboPerformance.getSelectedItem()); + if(psi!=null) { + kck.setPerformanceStrategy(psi.getStrategy().toString()); + } + kck.setCongestionAlgorithm((String) congestions.getComboBox().getSelectedItem()); kck.setBurstLimit(1.0+burstLimit.getSlider().getValue()/1000.0); @@ -1217,58 +1224,60 @@ public class KLALBStateGUI3 extends XFrame { tsk = new TimerTask() { @Override public void run() { - Object[] kll = kc.getLines().toArray(); + if (isVisible()) { + Object[] kll = kc.getLines().toArray(); - // 遍历所有线路,更新或添加TPanel2 - for (Object obj : kll) { - IPv6NetworkLink link = (IPv6NetworkLink) obj; - if (!(link instanceof KLALBRemoteLink)) { - continue; + // 遍历所有线路,更新或添加TPanel2 + for (Object obj : kll) { + IPv6NetworkLink link = (IPv6NetworkLink) obj; + if (!(link instanceof KLALBRemoteLink)) { + continue; + } + KLALBRemoteLink ent = (KLALBRemoteLink) link; + + Component[] count = ysp.getView().getComponents(); + boolean found = false; + + // 查找是否已有对应线路的面板 + for (Component tp : count) { + if (tp instanceof TPanel2) { + if (((TPanel2) tp).getTunnel().equals(ent)) { + tp.setVisible(showoffline.isSelected() || ( + ent.getState() != LinkStatus.DOWN)); + found = true; + break; + } + } + } + + // 如果没有找到,创建新面板 + if (!found) { + TPanel2 tp = new TPanel2(ent, kc); + tp.setVisible(showoffline.isSelected() || ( + ent.getState() != LinkStatus.DOWN)); + ysp.getView().add(tp); + } } - KLALBRemoteLink ent = (KLALBRemoteLink) link; + // 更新所有面板并移除不存在的线路 Component[] count = ysp.getView().getComponents(); - boolean found = false; - - // 查找是否已有对应线路的面板 for (Component tp : count) { if (tp instanceof TPanel2) { - if (((TPanel2) tp).getTunnel().equals(ent)) { - tp.setVisible(showoffline.isSelected() || ( - ent.getState() != LinkStatus.DOWN)); - found = true; - break; + if (kc.getLines().contains(((TPanel2) tp).getTunnel())) { + try { + if (tp.isVisible()) + ((TPanel2) tp).updateTraffic(); + } catch (RuntimeException e) { + e.printStackTrace(); + } + } else { + ysp.getView().remove(tp); } } } - - // 如果没有找到,创建新面板 - if (!found) { - TPanel2 tp = new TPanel2(ent, kc); - tp.setVisible(showoffline.isSelected() || ( - ent.getState()!= LinkStatus.DOWN)); - ysp.getView().add(tp); - } + + ysp.updateScrool(); } - - // 更新所有面板并移除不存在的线路 - Component[] count = ysp.getView().getComponents(); - for (Component tp : count) { - if (tp instanceof TPanel2) { - 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(); } }; t.scheduleAtFixedRate(tsk, 1000, 1000); @@ -1460,23 +1469,23 @@ public class KLALBStateGUI3 extends XFrame { tunDeviceName.setText(tunname!=null?tunname:""); // 加载TCP监听 - MultipurposeSocketAddress mpat = kck.getTCPListen(); + MultiProtocolSocketAddress mpat = kck.getTCPListen(); tcpListeningSet.setText(mpat != null ? mpat.toString() : ""); // 加载UDP监听 - MultipurposeSocketAddress mpau = kck.getUDPListen(); + MultiProtocolSocketAddress mpau = kck.getUDPListen(); udpListeningSet.setText(mpau != null ? mpau.toString() : ""); // 加载开放线路表 - List linet = kck.getLineTable(); + List linet = kck.getLineTable(); openLineTabelSet.setText(listToStr2(linet)); // 加载自动连接线路表 - List clinet = kck.getConnectLineTable(); + List clinet = kck.getConnectLineTable(); connectLineTabelSet.setText(listToStr2(clinet)); // 加载NTP服务器表 - List ntps = kck.getNtpServerTable(); + List ntps = kck.getNtpServerTable(); ntpServerSet.setText(listToStr2(ntps)); // 加载网络接口排除列表 @@ -1500,7 +1509,18 @@ public class KLALBStateGUI3 extends XFrame { denyQuery.setSelected( kck.isDenyLineTableQuery()); denyBroadcast.setSelected( kck.isDenyLineTableBroadcast()); - + + String stategy= kck.getPerformanceStrategy(); + PerformanceStrategy pfs=PerformanceStrategy.fromDescription(stategy); + if(pfs!=null) { + for (int i=0;i listModel=new XDefaultListModel<>(); + private XDefaultListModel listModel=new XDefaultListModel<>(); public KLALBController getController() { return controller; } @@ -73,7 +69,7 @@ public class NodeInformationPanel extends JPanel { panel_1.setLayout(new BorderLayout(0, 0)); panel_1.add(scrollPane); - JList list = new JList(listModel); + JList list = new JList(listModel); list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); scrollPane.setViewportView(list); tabbedPane.addTab(UIEnv.getRsb().getString("openlinetable"), null, panel_1, null); @@ -81,7 +77,7 @@ public class NodeInformationPanel extends JPanel { JButton btnNewButton = new JButton(UIEnv.getRsb().getString("addline")); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - List select=list.getSelectedValuesList(); + List select=list.getSelectedValuesList(); controller.addRemoteLines(select); } }); @@ -93,7 +89,7 @@ public class NodeInformationPanel extends JPanel { @Override public void valueChanged(ListSelectionEvent e) { - List select=list.getSelectedValuesList(); + List select=list.getSelectedValuesList(); btnNewButton.setEnabled( !select.isEmpty()) ; copy.setEnabled(!select.isEmpty()); } @@ -103,9 +99,9 @@ public class NodeInformationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { StringBuilder sb=new StringBuilder(); - List select=list.getSelectedValuesList(); - for (MultipurposeSocketAddress multipurposeSocketAddress : select) { - sb.append(multipurposeSocketAddress); + List select=list.getSelectedValuesList(); + for (MultiProtocolSocketAddress multiProtocolSocketAddress : select) { + sb.append(multiProtocolSocketAddress); sb.append('\n'); } Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(sb.toString()), null); @@ -152,8 +148,8 @@ public class NodeInformationPanel extends JPanel { try { client.requestOpenLines(new InetSocketAddress( address.toInet6Address(), KLALBRoutingProtocol.DEFAULT_PORT), (result)->{ listModel.clear(); - for (MultipurposeSocketAddress multipurposeSocketAddress : result) { - listModel.addElement(multipurposeSocketAddress); + for (MultiProtocolSocketAddress multiProtocolSocketAddress : result) { + listModel.addElement(multiProtocolSocketAddress); } }); } catch (IOException e) { diff --git a/src/org/kne/cloud/network/klalb/ui/PerformanceStrategyItem.java b/src/org/kne/cloud/network/klalb/ui/PerformanceStrategyItem.java new file mode 100644 index 0000000..4115936 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/PerformanceStrategyItem.java @@ -0,0 +1,20 @@ +package org.kne.cloud.network.klalb.ui; + +import org.kne.cloud.network.klalb.PerformanceStrategy; + +public class PerformanceStrategyItem { + private PerformanceStrategy strategy; + + public PerformanceStrategyItem(PerformanceStrategy strategy) { + this.strategy = strategy; + } + + public PerformanceStrategy getStrategy() { + return strategy; + } + + @Override + public String toString() { + return UIEnv.getRsb().getString(strategy.toString()); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/TPanel2.java b/src/org/kne/cloud/network/klalb/ui/TPanel2.java index eaac332..a8b57e4 100644 --- a/src/org/kne/cloud/network/klalb/ui/TPanel2.java +++ b/src/org/kne/cloud/network/klalb/ui/TPanel2.java @@ -9,7 +9,7 @@ import java.awt.Dimension; import javax.swing.SwingConstants; import javax.swing.border.LineBorder; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ipv6.IPv6AddressGroup; import org.kne.cloud.network.klalb.CONST; import org.kne.cloud.network.klalb.KLALBController; @@ -219,7 +219,7 @@ public class TPanel2 extends JPanel { @Override public void actionPerformed(ActionEvent e) { - MultipurposeSocketAddress mtar=tunnel.getSocketAddress(); + MultiProtocolSocketAddress mtar=tunnel.getSocketAddress(); if(mtar!=null) { kc.removeRemoteLines(mtar); }else { diff --git a/src/org/kne/cloud/network/kltp/KLTPInputStream.java b/src/org/kne/cloud/network/kltp/KLTPInputStream.java index 50bd8da..2ba5701 100644 --- a/src/org/kne/cloud/network/kltp/KLTPInputStream.java +++ b/src/org/kne/cloud/network/kltp/KLTPInputStream.java @@ -258,7 +258,7 @@ public class KLTPInputStream extends InputStream implements KLTPPacketConsumer, case KLTPPacket.KLTP_TYPE_DATA: //ackSequenceBatcher.putMessage(kseq); recvMap.put(kltp.getSequence(), kltp); - controller.getIpv6Router().runPacketSendTask(()->{ + controller.getIpv6Router().enqueuePacketSendTask(()->{ KLTPPacket pack=new KLTPPacket(streamUUID,KLTPPacket.KLTP_TYPE_ACK,kltp.getSequence(),0); pack.setCE(u.isCE()); return controller.createPacketToAddress(remoteaddr,0,pack); @@ -267,7 +267,7 @@ public class KLTPInputStream extends InputStream implements KLTPPacketConsumer, case KLTPPacket.KLTP_TYPE_DATAFIN: //ackSequenceBatcher.putMessage(kseq2); recvMap.put(kltp.getSequence(), kltp); - controller.getIpv6Router().runPacketSendTask(()->{ + controller.getIpv6Router().enqueuePacketSendTask(()->{ KLTPPacket pack=new KLTPPacket(streamUUID,KLTPPacket.KLTP_TYPE_ACK,kltp.getSequence(),0); pack.setCE(u.isCE()); return controller.createPacketToAddress(remoteaddr,0,pack); diff --git a/src/org/kne/cloud/network/minecraft/MinecraftScanner.java b/src/org/kne/cloud/network/minecraft/MinecraftScanner.java index c654940..289d748 100644 --- a/src/org/kne/cloud/network/minecraft/MinecraftScanner.java +++ b/src/org/kne/cloud/network/minecraft/MinecraftScanner.java @@ -1,23 +1,22 @@ package org.kne.cloud.network.minecraft; -import java.io.IOException; import java.net.UnknownHostException; import java.util.function.BiConsumer; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.scanner.InetAddressRange; import org.kne.cloud.network.scanner.PortRange; import org.kne.cloud.network.scanner.ScanRange; import org.kne.cloud.network.scanner.TCPNetworkScanner; public class MinecraftScanner extends TCPNetworkScanner{ - private BiConsumerminecraftConsumer; + private BiConsumerminecraftConsumer; - public BiConsumer getMinecraftConsumer() { + public BiConsumer getMinecraftConsumer() { return minecraftConsumer; } - public void setMinecraftConsumer(BiConsumer minecraftConsumer) { + public void setMinecraftConsumer(BiConsumer minecraftConsumer) { this.minecraftConsumer = minecraftConsumer; } { diff --git a/src/org/kne/cloud/network/minecraft/MinecraftServerAddress.java b/src/org/kne/cloud/network/minecraft/MinecraftServerAddress.java index 946a77b..ef8f7df 100644 --- a/src/org/kne/cloud/network/minecraft/MinecraftServerAddress.java +++ b/src/org/kne/cloud/network/minecraft/MinecraftServerAddress.java @@ -6,9 +6,9 @@ import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; -public class MinecraftServerAddress extends MultipurposeSocketAddress +public class MinecraftServerAddress extends MultiProtocolSocketAddress { private String originAddr; diff --git a/src/org/kne/cloud/network/minecraft/MinecraftServerPinger.java b/src/org/kne/cloud/network/minecraft/MinecraftServerPinger.java index fe18e31..93cd7ba 100644 --- a/src/org/kne/cloud/network/minecraft/MinecraftServerPinger.java +++ b/src/org/kne/cloud/network/minecraft/MinecraftServerPinger.java @@ -3,14 +3,8 @@ package org.kne.cloud.network.minecraft; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.EOFException; -import java.io.Externalizable; import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.io.OutputStream; import java.io.Serializable; -import java.io.StringReader; import java.net.Inet6Address; import java.net.InetAddress; import java.net.Socket; @@ -19,13 +13,11 @@ import java.util.Base64; import javax.imageio.ImageIO; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; public class MinecraftServerPinger implements Serializable{ /** @@ -34,7 +26,7 @@ public class MinecraftServerPinger implements Serializable{ private static final long serialVersionUID = 1L; private transient Socket socket; private transient MinecraftProtocolContext mpc=new MinecraftProtocolContext(); - private MultipurposeSocketAddress targetaddr; + private MultiProtocolSocketAddress targetaddr; @@ -53,11 +45,11 @@ public class MinecraftServerPinger implements Serializable{ private String icon; private transient BufferedImage image; - public MinecraftServerPinger(MultipurposeSocketAddress target) throws UnknownHostException, IOException { + public MinecraftServerPinger(MultiProtocolSocketAddress target) throws UnknownHostException, IOException { this(target,target.connectSocket()); } - public MinecraftServerPinger(MultipurposeSocketAddress target, Socket Asocket) throws UnknownHostException, IOException{ + public MinecraftServerPinger(MultiProtocolSocketAddress target, Socket Asocket) throws UnknownHostException, IOException{ targetaddr=target; socket=Asocket; socket.setTcpNoDelay(true); @@ -302,7 +294,7 @@ public class MinecraftServerPinger implements Serializable{ return json; } - public MultipurposeSocketAddress getTargetaddr() { + public MultiProtocolSocketAddress getTargetaddr() { return targetaddr; } diff --git a/src/org/kne/cloud/network/minecraft/MinecraftServerScanRange.java b/src/org/kne/cloud/network/minecraft/MinecraftServerScanRange.java index 4880e47..b2f3864 100644 --- a/src/org/kne/cloud/network/minecraft/MinecraftServerScanRange.java +++ b/src/org/kne/cloud/network/minecraft/MinecraftServerScanRange.java @@ -2,7 +2,7 @@ package org.kne.cloud.network.minecraft; import java.net.UnknownHostException; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.scanner.InetAddressRange; import org.kne.cloud.network.scanner.PortRange; import org.kne.cloud.network.scanner.ScanRange; @@ -13,7 +13,7 @@ public class MinecraftServerScanRange extends ScanRange { super(addressRange, portRange); } - public MinecraftServerScanRange(MultipurposeSocketAddress begin, MultipurposeSocketAddress end) + public MinecraftServerScanRange(MultiProtocolSocketAddress begin, MultiProtocolSocketAddress end) throws UnknownHostException { super(begin, end); } @@ -25,8 +25,8 @@ public class MinecraftServerScanRange extends ScanRange { @Override protected void setMsaString(String range) throws UnknownHostException { String[]sp=range.split("~"); - MultipurposeSocketAddress begin=MinecraftServerAddress.findAddress (sp[0]); - MultipurposeSocketAddress end; + MultiProtocolSocketAddress begin=MinecraftServerAddress.findAddress (sp[0]); + MultiProtocolSocketAddress end; if(sp.length>1) { end=MinecraftServerAddress.findAddress (sp[1]); }else { diff --git a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java index 0b5457f..033efc6 100644 --- a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java +++ b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java @@ -4,6 +4,7 @@ import java.util.UUID; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.network.klalb.KLALBUtils; +import org.kne.concurrent.LazyEvaluator; public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements SpeedAndTrafficMonitorData { @@ -13,14 +14,15 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S private long timewindowmax=1000000000L; private BandwidthSampler upSampler=new BandwidthSampler(); private BandwidthSampler downSampler=new BandwidthSampler(); - - - + + + + private final long TIME_WINDOW=2000000000L; public SpeedAndTrafficMonitorDataImpl(HighAccuracyClock clock) { super(); this.clock=clock; - uploadBandwidth=new ArrayListTimestampMonitor(clock,"UploadMonitor", 100, 5000000000L); - downloadBandwidth=new ArrayListTimestampMonitor(clock,"DownloadMonitor", 100, 5000000000L); + uploadBandwidth=new ArrayListTimestampMonitor(clock,"UploadMonitor", 100, TIME_WINDOW); + downloadBandwidth=new ArrayListTimestampMonitor(clock,"DownloadMonitor", 100, TIME_WINDOW); } @@ -86,12 +88,13 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S - + private LazyEvaluator outSpeedEvaluator=new LazyEvaluator(()->{return uploadBandwidth.calculateBandwidth(timewindow);}); public long getOutSpeed() { - return uploadBandwidth.calculateBandwidth(timewindow); + return outSpeedEvaluator.get(); } + private LazyEvaluator inSpeedEvaluator=new LazyEvaluator(()->{return downloadBandwidth.calculateBandwidth(timewindow);}); public long getInSpeed() { - return downloadBandwidth.calculateBandwidth(timewindow); + return inSpeedEvaluator.get(); } @@ -117,13 +120,15 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S + private LazyEvaluator outPPSEvaluator=new LazyEvaluator(()->{return uploadBandwidth.calculatePacketRate(timewindow);}); public long getOutPPS() { - return uploadBandwidth.calculatePacketRate(timewindow); + return outPPSEvaluator.get(); } - + + private LazyEvaluator inPPSEvaluator=new LazyEvaluator(()->{return downloadBandwidth.calculatePacketRate(timewindow);}); public long getInPPS() { - return downloadBandwidth.calculatePacketRate(timewindow); + return inPPSEvaluator.get(); } private long inSpeed; private long outSpeed; @@ -159,9 +164,18 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S public void update() { upSampler.update(); downSampler.update(); - uploadBandwidth.recordPacket(KLALBUtils.createGlobalUUID(),(int)upSampler.getPacketCountSinceLastSnapshot() ,(int)upSampler.getByteCountSinceLastSnapshot()); - downloadBandwidth.recordPacket(KLALBUtils.createGlobalUUID(),(int)downSampler.getPacketCountSinceLastSnapshot() ,(int) downSampler.getByteCountSinceLastSnapshot()); - + long uppacketcount=upSampler.getPacketCountSinceLastSnapshot(); + if(uppacketcount>0) { + uploadBandwidth.recordPacket(KLALBUtils.createGlobalUUID(), (int) uppacketcount, (int) upSampler.getByteCountSinceLastSnapshot()); + outSpeedEvaluator.markDirty(); + outPPSEvaluator.markDirty(); + } + long downpacketcount=downSampler.getPacketCountSinceLastSnapshot(); + if(downpacketcount>0) { + downloadBandwidth.recordPacket(KLALBUtils.createGlobalUUID(), (int) downpacketcount, (int) downSampler.getByteCountSinceLastSnapshot()); + inSpeedEvaluator.markDirty(); + inPPSEvaluator.markDirty(); + } long time=System.nanoTime(); if(time-stime>timewindowmax) { stime=time; diff --git a/src/org/kne/cloud/network/ntp/NTPContext.java b/src/org/kne/cloud/network/ntp/NTPContext.java index 4afac3d..80c2998 100644 --- a/src/org/kne/cloud/network/ntp/NTPContext.java +++ b/src/org/kne/cloud/network/ntp/NTPContext.java @@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.clock.NTPTimestamps; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; import org.kne.math.Long128; @@ -110,13 +110,13 @@ public class NTPContext implements Closeable, AutoCloseable { return clock; } - private ConcurrentHashMap> recvmap = new ConcurrentHashMap>(); + private ConcurrentHashMap> recvmap = new ConcurrentHashMap>(); protected void clearPackets() { recvmap.clear(); } - protected void putPacket(NTPv4Packet nv4, MultipurposeSocketAddress inetSocketAddress) { + protected void putPacket(NTPv4Packet nv4, MultiProtocolSocketAddress inetSocketAddress) { checkIP(); List newv = new Vector(); List oldv = recvmap.putIfAbsent(inetSocketAddress, newv); @@ -133,10 +133,10 @@ public class NTPContext implements Closeable, AutoCloseable { } private void checkIP() { - Set>> ens = recvmap.entrySet(); - for (Iterator>> iterator = ens.iterator(); iterator + Set>> ens = recvmap.entrySet(); + for (Iterator>> iterator = ens.iterator(); iterator .hasNext();) { - Entry> entry = (Entry>) iterator + Entry> entry = (Entry>) iterator .next(); AtomicBoolean ab = new AtomicBoolean(false); ios.forEach((x) -> { @@ -153,7 +153,7 @@ public class NTPContext implements Closeable, AutoCloseable { } private class PeerInfo implements Comparable { - private MultipurposeSocketAddress address; + private MultiProtocolSocketAddress address; private int leapIndicator = 3; private int stratum = 16; private int referenceIdentifier; @@ -265,10 +265,10 @@ public class NTPContext implements Closeable, AutoCloseable { private List mergeResponses() { List peerInfo = new ArrayList(); - Set>> ens = recvmap.entrySet(); - for (Iterator>> iterator = ens.iterator(); iterator + Set>> ens = recvmap.entrySet(); + for (Iterator>> iterator = ens.iterator(); iterator .hasNext();) { - Entry> entry = (Entry>) iterator + Entry> entry = (Entry>) iterator .next(); List newv = entry.getValue(); diff --git a/src/org/kne/cloud/network/ntp/NTPSocketType.java b/src/org/kne/cloud/network/ntp/NTPSocketType.java new file mode 100644 index 0000000..0d7b3ff --- /dev/null +++ b/src/org/kne/cloud/network/ntp/NTPSocketType.java @@ -0,0 +1,20 @@ +package org.kne.cloud.network.ntp; + +import org.kne.cloud.network.UDPSocketType; + +public class NTPSocketType extends UDPSocketType { + private static final NTPSocketType INSTANCE = new NTPSocketType(); + + private NTPSocketType() { + super(); + } + + public static NTPSocketType getInstance() { + return INSTANCE; + } + + @Override + public int getDefaultPort() { + return 123; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ntp/NTPv4Protocol.java b/src/org/kne/cloud/network/ntp/NTPv4Protocol.java index a27d895..2b51f20 100644 --- a/src/org/kne/cloud/network/ntp/NTPv4Protocol.java +++ b/src/org/kne/cloud/network/ntp/NTPv4Protocol.java @@ -20,7 +20,8 @@ import java.util.concurrent.locks.ReentrantLock; import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.clock.NTPTimestamps; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; +import org.kne.cloud.network.ThreadTool; import org.kne.io.KNEChannels; import org.kne.math.Long128; @@ -32,7 +33,7 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { private static final long EPHEMERAL_TIMEOUT = 60000000000L; public static class NTPPeer { - private MultipurposeSocketAddress address; + private MultiProtocolSocketAddress address; private boolean isEphemeral;// ephemeral private volatile long ephemeralUpdateTime = System.nanoTime(); private volatile long pollInterval = DEFAULT_POLL_INTERVAL; @@ -70,11 +71,11 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { this.pollInterval = pollInterval; } - public NTPPeer(MultipurposeSocketAddress address, int requestMode) { + public NTPPeer(MultiProtocolSocketAddress address, int requestMode) { this(address, requestMode, false); } - protected NTPPeer(MultipurposeSocketAddress address, int requestMode, boolean isEphemeral) { + protected NTPPeer(MultiProtocolSocketAddress address, int requestMode, boolean isEphemeral) { super(); checkRequestMode(requestMode); this.address = address; @@ -90,10 +91,10 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { } public NTPPeer(String hostport, int requestMode) { - this(new MultipurposeSocketAddress(hostport), requestMode); + this(new MultiProtocolSocketAddress(hostport), requestMode); } - public MultipurposeSocketAddress getAddress() { + public MultiProtocolSocketAddress getAddress() { return address; } @@ -153,17 +154,28 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { private NTPContext context; private DatagramSocket dgs; - private MultipurposeSocketAddress bind; + private MultiProtocolSocketAddress bind; public NTPv4Protocol(NTPContext context) throws UnknownHostException, IOException { - this(context, new MultipurposeSocketAddress("UDP", "::0", NTP_DEFAULT_PORT)); + this(context, new MultiProtocolSocketAddress("UDP", "::0", NTP_DEFAULT_PORT)); } - public NTPv4Protocol(NTPContext context, MultipurposeSocketAddress bind) throws UnknownHostException, IOException { + public NTPv4Protocol(NTPContext context, MultiProtocolSocketAddress bind) throws UnknownHostException, IOException { this.bind = bind; this.context = context; dgs = bind.listenDatagramSocket(); context.registerIO(this); + Thread t4= ThreadTool.makeVThread("NTPv4 Packet Cleaner",()->{ + while(isClosed()){ + removeTimeoutTimestamp(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + t4.start(); Thread tr = new Thread(recv); tr.setName("NTPv4 Receive Thread"); tr.start(); @@ -219,7 +231,6 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { private void putOriginTimestamp(NTPv4Packet nv4, NTPPeer peer) { checkLock.lock(); try { - removeTimeoutTimestamp(); checkList.add(new CheckListItem(nv4.getTransmitTimestamp128(), peer)); } finally { checkLock.unlock(); @@ -227,13 +238,18 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { } private void removeTimeoutTimestamp() { - for (Iterator iterator = checkList.iterator(); iterator.hasNext();) { - CheckListItem bigInteger = (CheckListItem) iterator.next(); - if (bigInteger.checkTimeout()) { - if (showPacket) - System.out.println("timeout:" + bigInteger.timeStamp); - iterator.remove(); + checkLock.lock(); + try { + for (Iterator iterator = checkList.iterator(); iterator.hasNext(); ) { + CheckListItem bigInteger = (CheckListItem) iterator.next(); + if (bigInteger.checkTimeout()) { + if (showPacket) + System.out.println("timeout:" + bigInteger.timeStamp); + iterator.remove(); + } } + }finally{ + checkLock.unlock(); } } @@ -266,7 +282,7 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { return null; } - NTPPeer findPeer(MultipurposeSocketAddress addr) { + NTPPeer findPeer(MultiProtocolSocketAddress addr) { Object[] objs = peers.toArray(); for (int i = 0; i < objs.length; i++) { NTPPeer np = (NTPPeer) objs[i]; @@ -291,7 +307,7 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { while (!dgs.isClosed()) { AtomicReference isa = new AtomicReference<>(); NTPv4Packet nv4 = receiveNTPPacket(isa); - MultipurposeSocketAddress mpsafrom = new MultipurposeSocketAddress(bind.getType(), isa.get()); + MultiProtocolSocketAddress mpsafrom = new MultiProtocolSocketAddress(bind.getProtocol(), isa.get()); switch (nv4.getMode()) { case NTPv4Packet.NTP_SYMMETRIC_ACTIVE: NTPv4Packet nv4r = new NTPv4Packet(context.getClock()); @@ -393,7 +409,7 @@ public class NTPv4Protocol implements Closeable, AutoCloseable { HighAccuracyClock hac = new HighAccuracyClock(); NTPContext context = new NTPContext(hac); System.out.println(context); - NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultiProtocolSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 nvc.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123", NTPv4Packet.NTP_CLIENT)); nvc.getPeers().add(new NTPPeer("{UDP}time.windows.com:123", NTPv4Packet.NTP_CLIENT)); nvc.getPeers().add(new NTPPeer("{UDP}127.0.0.1:123", NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); diff --git a/src/org/kne/cloud/network/ntp/TestNTP1.java b/src/org/kne/cloud/network/ntp/TestNTP1.java index 6e4429a..23e8d16 100644 --- a/src/org/kne/cloud/network/ntp/TestNTP1.java +++ b/src/org/kne/cloud/network/ntp/TestNTP1.java @@ -4,8 +4,7 @@ import java.io.IOException; import java.net.UnknownHostException; import org.kne.cloud.clock.HighAccuracyClock; -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; +import org.kne.cloud.network.MultiProtocolSocketAddress; public class TestNTP1 { public static void main(String[] args) throws UnknownHostException, IOException { @@ -13,7 +12,7 @@ public class TestNTP1 { NTPContext context = new NTPContext(hac); context.syncToSystem(); System.out.println(context); - NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultiProtocolSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 //nvc.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123", NTPv4Packet.NTP_CLIENT)); } } diff --git a/src/org/kne/cloud/network/ntp/TestNTP2.java b/src/org/kne/cloud/network/ntp/TestNTP2.java index ad8616a..388372a 100644 --- a/src/org/kne/cloud/network/ntp/TestNTP2.java +++ b/src/org/kne/cloud/network/ntp/TestNTP2.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.net.UnknownHostException; import org.kne.cloud.clock.HighAccuracyClock; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; public class TestNTP2 { @@ -13,7 +13,7 @@ public class TestNTP2 { NTPContext context = new NTPContext(hac); context.syncToSystem(); System.out.println(context); - NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:0"));// 106.55.184.199 + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultiProtocolSocketAddress("{UDP}0.0.0.0:0"));// 106.55.184.199 nvc.getPeers().add(new NTPPeer("{UDP}127.0.0.1:123", NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); } diff --git a/src/org/kne/cloud/network/perf/Kperf.java b/src/org/kne/cloud/network/perf/Kperf.java index ae2f604..a70ecfb 100644 --- a/src/org/kne/cloud/network/perf/Kperf.java +++ b/src/org/kne/cloud/network/perf/Kperf.java @@ -7,7 +7,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import org.kne.cloud.clock.AdjustedNanoClock; import org.kne.cloud.clock.HighAccuracyClock; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.SpeedLimiter; import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.klalb.KLALBPacket; @@ -32,8 +32,8 @@ public class Kperf implements Runnable{ private static final boolean showpacket = false; private volatile AdjustedNanoClock adjnc = new AdjustedNanoClock(); - private MultipurposeSocketAddress targetAddress; - private MultipurposeSocketAddress bindAddress; + private MultiProtocolSocketAddress targetAddress; + private MultiProtocolSocketAddress bindAddress; private volatile boolean connected=false; private volatile KLALBPacketLink link; @@ -43,13 +43,13 @@ public class Kperf implements Runnable{ private volatile boolean closed = false; private volatile ThreadParker tlock=new ThreadParker(); - public Kperf(MultipurposeSocketAddress targetAddress,MultipurposeSocketAddress bindAddress) { + public Kperf(MultiProtocolSocketAddress targetAddress, MultiProtocolSocketAddress bindAddress) { Objects.requireNonNull(targetAddress); this.targetAddress=targetAddress; this.bindAddress=bindAddress; } - public Kperf(MultipurposeSocketAddress targetAddress) { - this(targetAddress,new MultipurposeSocketAddress("[::0]:0")); + public Kperf(MultiProtocolSocketAddress targetAddress) { + this(targetAddress,new MultiProtocolSocketAddress("[::0]:0")); } public Kperf(KLALBPacketLink link) { Objects.requireNonNull(link); diff --git a/src/org/kne/cloud/network/perf/NodeBenchmark.java b/src/org/kne/cloud/network/perf/NodeBenchmark.java index aaf3cab..effc464 100644 --- a/src/org/kne/cloud/network/perf/NodeBenchmark.java +++ b/src/org/kne/cloud/network/perf/NodeBenchmark.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.SocketChannelListener; import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.klalb.KLALBController; @@ -58,7 +58,7 @@ for (int i = 0; i < nodes; i++) { for (int j = 0; j < 1; j++) { int ind=r.nextInt(size); NodeEntry ne=nodeList.get(ind); - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress((InetSocketAddress) ne.getScl().getServerSocketChannel().getLocalAddress()); + MultiProtocolSocketAddress mpsa=new MultiProtocolSocketAddress((InetSocketAddress) ne.getScl().getServerSocketChannel().getLocalAddress()); kct.addRemoteLines(mpsa); System.out.println("connect:" +ne.getKc().getSelf().getAddress()); @@ -75,7 +75,7 @@ for (int i = 0; i < nodes; i++) { } try { NodeEntry ne=nodeList.get(0); -MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress((InetSocketAddress) ne.getScl().getServerSocketChannel().getLocalAddress()); +MultiProtocolSocketAddress mpsa=new MultiProtocolSocketAddress((InetSocketAddress) ne.getScl().getServerSocketChannel().getLocalAddress()); klalbController.addRemoteLines(mpsa); } catch (IOException e) { e.printStackTrace(); diff --git a/src/org/kne/cloud/network/scanner/ScanRange.java b/src/org/kne/cloud/network/scanner/ScanRange.java index 0709232..405cfb1 100644 --- a/src/org/kne/cloud/network/scanner/ScanRange.java +++ b/src/org/kne/cloud/network/scanner/ScanRange.java @@ -4,7 +4,7 @@ import java.io.Serializable; import java.net.UnknownHostException; import java.util.Objects; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; public class ScanRange implements Serializable { public ScanRange(String range) throws UnknownHostException { @@ -12,21 +12,21 @@ public class ScanRange implements Serializable { } protected void setMsaString(String range) throws UnknownHostException { String[]sp=range.split("~"); - MultipurposeSocketAddress begin=new MultipurposeSocketAddress(sp[0]); - MultipurposeSocketAddress end; + MultiProtocolSocketAddress begin=new MultiProtocolSocketAddress(sp[0]); + MultiProtocolSocketAddress end; if(sp.length>1) { - end=new MultipurposeSocketAddress(sp[1]); + end=new MultiProtocolSocketAddress(sp[1]); }else { - end=new MultipurposeSocketAddress(sp[0]); + end=new MultiProtocolSocketAddress(sp[0]); } setMsa(begin, end); } - public ScanRange(MultipurposeSocketAddress begin,MultipurposeSocketAddress end) throws UnknownHostException { + public ScanRange(MultiProtocolSocketAddress begin, MultiProtocolSocketAddress end) throws UnknownHostException { setMsa(begin,end); } - protected void setMsa(MultipurposeSocketAddress begin, MultipurposeSocketAddress end) throws UnknownHostException { + protected void setMsa(MultiProtocolSocketAddress begin, MultiProtocolSocketAddress end) throws UnknownHostException { this.addressRange=new InetAddressRange(begin.getHost(), end.getHost()); this.portRange=new PortRange(begin.getPort(), end.getPort()); } @@ -47,7 +47,7 @@ public class ScanRange implements Serializable { } public String toString() { - return new MultipurposeSocketAddress(addressRange.getBeginHost(), portRange.getBegin())+"~"+new MultipurposeSocketAddress(addressRange.getEndHost(), portRange.getEnd()); + return new MultiProtocolSocketAddress(addressRange.getBeginHost(), portRange.getBegin())+"~"+new MultiProtocolSocketAddress(addressRange.getEndHost(), portRange.getEnd()); } @Override public int hashCode() { diff --git a/src/org/kne/cloud/network/scanner/TCPNetworkScanner.java b/src/org/kne/cloud/network/scanner/TCPNetworkScanner.java index be5e6bf..59d47c0 100644 --- a/src/org/kne/cloud/network/scanner/TCPNetworkScanner.java +++ b/src/org/kne/cloud/network/scanner/TCPNetworkScanner.java @@ -10,7 +10,6 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -20,11 +19,11 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.function.BiConsumer; import java.util.function.Consumer; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.ThreadTool; public class TCPNetworkScanner implements Runnable { - private BiConsumer consumer; + private BiConsumer consumer; private ConsumerprocessConsumer; public Consumer getProcessConsumer() { @@ -44,11 +43,11 @@ public class TCPNetworkScanner implements Runnable { return ranges; } - public BiConsumer getConsumer() { + public BiConsumer getConsumer() { return consumer; } - public void setConsumer(BiConsumer consumer) { + public void setConsumer(BiConsumer consumer) { this.consumer = consumer; } @@ -128,13 +127,13 @@ ThreadPoolExecutor excd=(ThreadPoolExecutor) Executors.newFixedThreadPool(8); exc.execute(()->{ - MultipurposeSocketAddress mpsa; + MultiProtocolSocketAddress mpsa; if (currAddress.equals(inetAddressRange.getBegin())) { - mpsa = new MultipurposeSocketAddress(inetAddressRange.getBeginHost(), curport0); + mpsa = new MultiProtocolSocketAddress(inetAddressRange.getBeginHost(), curport0); }else if (currAddress.equals(inetAddressRange.getEnd())) { - mpsa = new MultipurposeSocketAddress(inetAddressRange.getEndHost(), curport0); + mpsa = new MultiProtocolSocketAddress(inetAddressRange.getEndHost(), curport0); } else { - mpsa = new MultipurposeSocketAddress(currAddress.getHostAddress(), + mpsa = new MultiProtocolSocketAddress(currAddress.getHostAddress(), curport0); } Socket s = null; @@ -228,7 +227,7 @@ ThreadPoolExecutor excd=(ThreadPoolExecutor) Executors.newFixedThreadPool(8); System.arraycopy( new BigInteger(curr).add(BigInteger.valueOf(1)).toByteArray(), 0, curr, 0, curr.length); ; } - protected void acceptMultipurposeSocketAddress(MultipurposeSocketAddress scanned, Socket s) { + protected void acceptMultipurposeSocketAddress(MultiProtocolSocketAddress scanned, Socket s) { consumer.accept(scanned,s); } diff --git a/src/org/kne/cloud/network/srv6/JsonDataPacket.java b/src/org/kne/cloud/network/srv6/JsonDataPacket.java index e94d640..fef11b4 100644 --- a/src/org/kne/cloud/network/srv6/JsonDataPacket.java +++ b/src/org/kne/cloud/network/srv6/JsonDataPacket.java @@ -1,29 +1,14 @@ package org.kne.cloud.network.srv6; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.EOFException; -import java.io.Externalizable; import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; import java.io.Serializable; -import java.net.Inet6Address; import java.nio.ByteBuffer; -import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.NetworkPacket; -import org.kne.cloud.network.ipv6.IPv6AddressGroup; +import org.kne.cloud.network.MultiProtocolSocketAddress; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -53,7 +38,7 @@ public class JsonDataPacket extends KLALBRoutingProtocolPacket implements Serial private static Gson gson; static{ GsonBuilder gb=new GsonBuilder(); - MultipurposeSocketAddress.registerToGsonBuilder(gb); + MultiProtocolSocketAddress.registerToGsonBuilder(gb); gson=gb.create(); } diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java index 4b0df24..ef63205 100644 --- a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java @@ -10,7 +10,7 @@ import java.util.UUID; import java.util.function.BiConsumer; import java.util.function.Consumer; -import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.MultiProtocolSocketAddress; import org.kne.cloud.network.congestion.NOCongestionAlgorithm; import org.kne.cloud.network.congestion.SendPacketSlidingWindow; import org.kne.opencl64.Releaser; @@ -33,16 +33,16 @@ public class KLALBRoutingProtocolAPIClient { if ((relate = window.ack(ruid)) != null) { List connects = (List) dataobj.getData(); - List connectsm = new ArrayList(connects.size()); + List connectsm = new ArrayList(connects.size()); for (Object open : connects) { - if (open instanceof MultipurposeSocketAddress) { - connectsm.add((MultipurposeSocketAddress) open); + if (open instanceof MultiProtocolSocketAddress) { + connectsm.add((MultiProtocolSocketAddress) open); } else { - connectsm.add(new MultipurposeSocketAddress((String) open)); + connectsm.add(new MultiProtocolSocketAddress((String) open)); } } - ((Consumer>) relate.getUserCallback()).accept(connectsm); + ((Consumer>) relate.getUserCallback()).accept(connectsm); } break; } @@ -56,7 +56,7 @@ public class KLALBRoutingProtocolAPIClient { clr.register(this, releaser); } - public void requestOpenLines(SocketAddress addr, Consumer> callback) + public void requestOpenLines(SocketAddress addr, Consumer> callback) throws IOException { UUID suid = UUID.randomUUID(); KLALBRoutingProtocolJsonData json = new KLALBRoutingProtocolJsonData( diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java index f6440f7..46f6014 100644 --- a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java @@ -4,13 +4,8 @@ import java.io.IOException; import java.lang.ref.Cleaner; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.ArrayList; -import java.util.UUID; import java.util.function.BiConsumer; -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.ThreadTool; -import org.kne.cloud.network.congestion.SendPacketSlidingWindow; import org.kne.cloud.network.klalb.KLALBController; import org.kne.opencl64.Releaser; diff --git a/src/org/kne/cloud/network/srv6/SRv6Router.java b/src/org/kne/cloud/network/srv6/SRv6Router.java index 08daeec..5653179 100644 --- a/src/org/kne/cloud/network/srv6/SRv6Router.java +++ b/src/org/kne/cloud/network/srv6/SRv6Router.java @@ -46,6 +46,8 @@ import org.kne.cloud.network.ipv6.PostcardEntry; import org.kne.cloud.network.ipv6.RouteItem; import org.kne.cloud.network.klalb.KLALBRemoteLink; import org.kne.cloud.network.klalb.KLALBUtils; +import org.kne.cloud.network.klalb.PerformanceStrategy; +import org.kne.cloud.network.klalb.ui.PerformanceStrategyItem; import org.kne.concurrent.HighPerformanceExecutor2; import org.kne.concurrent.TimeoutConcurrentHashMap; import org.pcap4j.packet.IllegalRawDataException; @@ -62,6 +64,8 @@ public class SRv6Router { private static final int IPv6_BITS = 128; // IPv6地址位数 + private PerformanceStrategy performanceStrategy=PerformanceStrategy.MULTI_FILL; + /*private TimeoutConcurrentHashMap flowIDmap = new TimeoutConcurrentHashMap( 60000000000L); */ @@ -161,6 +165,14 @@ public class SRv6Router { }; + public void setPerformanceStrategy(PerformanceStrategy performanceStrategy) { + this.performanceStrategy=performanceStrategy; + } + + public PerformanceStrategy getPerformanceStrategy(){ + return performanceStrategy; + } + // 链路状态监听器实现 private class LinkListener implements IPv6LinkStateListener { @@ -765,44 +777,44 @@ public class SRv6Router { //private static HighPerformanceExecutor2 defaultExecutor = new HighPerformanceExecutor2(4, Thread.ofVirtual().name("SRv6 Routing").factory()); - public static HighPerformanceExecutor2 getDefaultExecutor() { + /*public static HighPerformanceExecutor2 getDefaultExecutor() { return defaultExecutor; - } + }*/ // private ArrayBlockingQueue> packetQueue=new // ArrayBlockingQueue<>(10000); public void enqueuePacketSendTask(Supplier sendTask) { // packetQueue.add(object); - defaultExecutor.executeWithCongestionReport((state) -> { - try { - long start=System.nanoTime(); - IPv6Packet packet=sendTask.get(); - if(state) { - packet.markCE(); - } - insertSRHandRoutePacket(null, packet); // 插入SRH并路由 - long time=System.nanoTime()-start; - backplaneCount(time,state); - } catch (Exception e) { - e.printStackTrace(); - } - },20); + switch(performanceStrategy) { + case SINGLE_CORE: + runPacketSendTask0(sendTask, false); + break; + case MULTI_FILL: + case MULTI_SCATTER: + defaultExecutor.executeWithCongestionReport((state) -> { + runPacketSendTask0(sendTask, state); + }, 20,performanceStrategy); + + break; + } } - public void runPacketSendTask(Supplier sendTask) { + public void runPacketSendTask0(Supplier sendTask,boolean ecn) { try { - boolean state=false; long start=System.nanoTime(); IPv6Packet packet=sendTask.get(); - if(state) { + if(ecn) { packet.markCE(); } insertSRHandRoutePacket(null, packet); // 插入SRH并路由 long time=System.nanoTime()-start; - backplaneCount(time,state); + backplaneCount(time,ecn); } catch (Exception e) { e.printStackTrace(); } } + public void runPacketSendTask(Supplier sendTask) { + runPacketSendTask0(sendTask,false); + } public void onReceive(IPv6NetworkLink link,IPv6Packet t){ if (unduplicate(t)) { @@ -824,7 +836,7 @@ public class SRv6Router { } catch (Exception e) { e.printStackTrace(); } - },20); + },20,performanceStrategy); } public void enqueuePacket(IPv6Packet packet) { diff --git a/src/org/kne/concurrent/HighPerformanceExecutor2.java b/src/org/kne/concurrent/HighPerformanceExecutor2.java index f5c0fd4..52d30a7 100644 --- a/src/org/kne/concurrent/HighPerformanceExecutor2.java +++ b/src/org/kne/concurrent/HighPerformanceExecutor2.java @@ -1,21 +1,13 @@ package org.kne.concurrent; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Queue; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.LockSupport; import java.util.function.Consumer; import org.jctools.queues.MpscArrayQueue; +import org.kne.cloud.network.klalb.PerformanceStrategy; public class HighPerformanceExecutor2 implements Executor { @@ -33,6 +25,8 @@ public class HighPerformanceExecutor2 implements Executor { threads[i]=t; } } + + private static class ThreadElement implements Runnable{ private MpscArrayQueue queue=new MpscArrayQueue(2048); private AtomicInteger size=new AtomicInteger(); @@ -80,7 +74,7 @@ public class HighPerformanceExecutor2 implements Executor { } @Override public void execute(Runnable command) { - if(execute0((x)->{command.run();},1000)) { + if(execute0((x)->{command.run();},1000, PerformanceStrategy.MULTI_FILL)) { return; } System.out.println("loss!"); @@ -89,42 +83,47 @@ public class HighPerformanceExecutor2 implements Executor { } - /*private long vl=0; - private boolean execute0(Consumer command,int limit) { - long ord=vl++; + private long vl=0; + + private boolean execute0(Consumer command, int limit, PerformanceStrategy strategy) { + if(strategy.equals(PerformanceStrategy.MULTI_SCATTER)){ + long ord=vl++; ThreadElement te= threads[(int) (ord%threads.length)]; boolean b=te.size()>limit; return te.putTask( ()->{command.accept(b);}); - }*/ - - private boolean execute0(Consumer command,int limit) { - for(int i=0;ilimit; - if(!b) { - if(te.putTask( ()->{command.accept(false);})){ - return true; + }else { + for (int i = 0; i < threads.length; i++) { + ThreadElement te = threads[i]; + boolean b = te.size() > limit; + if (!b) { + if (te.putTask(() -> { + command.accept(false); + })) { + return true; + } + } } + + for (int i = 0; i < threads.length; i++) { + ThreadElement te = threads[i]; + if (te.putTask(() -> { + command.accept(true); + })) { + return true; + } } + return false; } - - for(int i=0;i{command.accept(true);})){ - return true; - } - } - return false; } public void executeWithCongestionReport(Consumer command) { - if(execute0(command,1000)) { + if(execute0(command,1000, PerformanceStrategy.MULTI_FILL)) { return; } System.out.println("loss!"); } - public void executeWithCongestionReport(Consumer command,int limit) { - if(execute0(command,limit)) { + public void executeWithCongestionReport(Consumer command, int limit, PerformanceStrategy strategy) { + if(execute0(command,limit,strategy)) { return; } System.out.println("loss!"); diff --git a/src/org/kne/concurrent/LazyEvaluator.java b/src/org/kne/concurrent/LazyEvaluator.java new file mode 100644 index 0000000..f9226f7 --- /dev/null +++ b/src/org/kne/concurrent/LazyEvaluator.java @@ -0,0 +1,65 @@ +package org.kne.concurrent; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; + +/** + * 惰性计算器:只在输入变化且输出被需要时重算。 + * + * 使用场景:路由表重算、统计信息聚合、UI 数据更新等 + * + * @param 输出类型 + */ +public class LazyEvaluator { + + private final Supplier recomputeFn; // 重算函数(可能较重) + private final AtomicBoolean dirty = new AtomicBoolean(true); // true表示需要重算 + private volatile T cachedResult; // 缓存结果(volatile保证可见性) + + /** + * @param recomputeFn 当真正需要重算时,调用此函数生成新值 + */ + public LazyEvaluator(Supplier recomputeFn) { + this.recomputeFn = recomputeFn; + } + + /** + * 标记输入已变化(每次变化都调用) + * CAS 保证多线程下只有一个线程真正置脏,避免无谓的竞争 + */ + public boolean markDirty() { + return dirty.compareAndSet(false, true); + } + + /** + * 获取当前值(如果 dirty 且被需要,则触发重算) + * 这个方法由需要输出的地方(如 UI 线程、路由引擎)调用 + */ + public T get() { + if (dirty.get()) { + synchronized (this) { + // double-check:防止多个线程同时进入重算 + if (dirty.get()) { + cachedResult = recomputeFn.get(); + dirty.set(false); + } + } + } + return cachedResult; + } + + /** + * 获取当前缓存的值(不触发重算) + * 适合那些“如果已经算好就直接用,否则也不强求”的场景 + */ + public T getCached() { + return cachedResult; + } + + /** + * 当前是否需要重算 + */ + public boolean isDirty() { + return dirty.get(); + } +} \ No newline at end of file