KLALB V3.6.0 写了一半

This commit is contained in:
Administrator
2026-02-27 08:32:03 +08:00
parent 816e672843
commit 620afef715
164 changed files with 8381 additions and 13495 deletions
+11 -12
View File
@@ -9,24 +9,23 @@ import java.net.Inet6Address;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import org.kne.cloud.network.ipv6.Inet6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
public class ADDRPacket extends KLALBPacket {
private static final int HEADER_LENGTH=18;
public Inet6AddressGroup getAddr() {
byte[]b=new byte[16];
klalbHeader.get(1, b);
try {
return new Inet6AddressGroup( (Inet6Address) Inet6Address.getByAddress(b),klalbHeader.get(17)&0xff);
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
public IPv6AddressGroup getAddr() {
long high=klalbHeader.getLong(1);
long low=klalbHeader.getLong(9);
int perf=klalbHeader.get(17)&0xff;
return new IPv6AddressGroup(new IPv6Address(high, low), perf);
}
public ADDRPacket(Inet6AddressGroup addr) {
public ADDRPacket(IPv6AddressGroup addr) {
super(ADDR,HEADER_LENGTH);
klalbHeader.put(1, addr.getAddress().getAddress());
klalbHeader.putLong(1, addr.getAddress().getHigh());
klalbHeader.putLong(9, addr.getAddress().getLow());
klalbHeader.put(17,(byte) addr.getPrefixLength());
}
@@ -0,0 +1,18 @@
package org.kne.cloud.network.klalb;
import java.io.IOException;
import java.net.Inet6Address;
import java.util.List;
import org.kne.cloud.network.ipv6.AbstractIPv6NetworkLink;
import org.kne.cloud.network.ipv6.ControlledIPv6NetworkLink;
import org.kne.cloud.network.ipv6.IPv6Packet;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.ipv6.Neighbor;
import org.kne.cloud.network.ipv6.RouteItem;
public abstract class AbstractControlledIPv6NetworkLink extends AbstractIPv6NetworkLink implements ControlledIPv6NetworkLink{
}
@@ -21,78 +21,9 @@ public abstract class AbstractKLALBPacketLink implements KLALBPacketLink {
AbstractKLALBPacketLink.defaultSoTimeout = defaultSoTimeout;
}
private LongAdder[] inputTrafficCounters;
private LongAdder[] outputTrafficCounters;
private LongAdder[] inputPacketsCounters;
private LongAdder[] outputPacketsCounters;
@Override
public void setOutputPacketsCounters(LongAdder[] outCounter) {
outputPacketsCounters=outCounter;
}
@Override
public void setInputPacketsCounters(LongAdder[] inCounter) {
inputPacketsCounters=inCounter;
}
@Override
public void setOutputTrafficCounters(LongAdder[] outCounter) {
this.outputTrafficCounters=outCounter;
}
@Override
public void setInputTrafficCounters(LongAdder[] inCounter) {
this.inputTrafficCounters=inCounter;
}
public LongAdder[] getInputTrafficCounters() {
return inputTrafficCounters;
}
public LongAdder[] getOutputTrafficCounters() {
return outputTrafficCounters;
}
public LongAdder[] getInputPacketsCounters() {
return inputPacketsCounters;
}
public LongAdder[] getOutputPacketsCounters() {
return outputPacketsCounters;
}
protected void incOutput(int packetLength) {
if(outputTrafficCounters!=null) {
for(LongAdder al:outputTrafficCounters) {
al.add(packetLength);
}
}
if(outputPacketsCounters!=null) {
for(LongAdder al:outputPacketsCounters) {
al.add(1);
}
}
}
protected void incInput(int packetLength) {
if(inputTrafficCounters!=null) {
for(LongAdder al:inputTrafficCounters) {
al.add(packetLength);
}
}
if(inputPacketsCounters!=null) {
for(LongAdder al:inputPacketsCounters) {
al.add(1);
}
}
}
@Override
public void writeKLALBPackets(List<KLALBPacket> kps) throws IOException {
for(KLALBPacket pack:kps) {
writeKLALBPacket(pack);
}
}
@Override
public void writeKLALBPacket(KLALBPacket kp) throws IOException {
@@ -103,6 +34,8 @@ public abstract class AbstractKLALBPacketLink implements KLALBPacketLink {
writePacket(dataWrite);
}
protected abstract void writePacket(ByteBuffer dataWrite) throws IOException;
@Override
public KLALBPacket readKLALBPacket() throws IOException {
ByteBuffer buffer=readPacket();
@@ -111,4 +44,6 @@ public abstract class AbstractKLALBPacketLink implements KLALBPacketLink {
}
return KLALBPacket.readKLALBPacketFromChannel(KNEChannels.newReadableChannel(buffer));
}
protected abstract ByteBuffer readPacket() throws IOException;
}
@@ -25,7 +25,7 @@ public class BWINFPacket extends KLALBPacket {
}
public BWINFPacket(long upSpeed,long downSpeed) {
super( BWINF,HEADER_LENGTH,-1);
super( BWINF,HEADER_LENGTH);
klalbHeader.putLong(upSpeed);
klalbHeader.putLong(downSpeed);
}
+14 -5
View File
@@ -2,11 +2,20 @@ package org.kne.cloud.network.klalb;
public class CONST {
public static final String klalb="KLALB";
public static final String klalbver="3.4";
public static final int bversion=3;
public static final int sversion=1;
public static final int itemwidth = 720;
public static final int linepanelheight = 45;
public static final int settingheight = 30;
public static final int mversion=6;
public static final int sversion=0;
public static final String klalbver=bversion+"."+mversion+"."+sversion;
public static final String KLALB_DECENTRALIZED_S_RV6_NETWORK = "KLALB Decentralized SRv6 Network";
public static final String KLALB_S_RV6 = "KLALB_SRv6";
public static final int itemwidth = 1000;
public static final int linepanelheight = 41;
public static final int settingheight = 30;
public static final int dialwidth = 150;
}
@@ -21,7 +21,6 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
public long getTotalLength() {
return HEADER_LENGTH+dataBuffer.limit();
}
volatile long resendtimer=System.nanoTime();
private ByteBuffer dataBuffer;//=NetworkPacket.databufferpool_65535.borrow();
@@ -64,6 +63,7 @@ public class DATATPacket extends KLALBPacket implements PortPacket{
}
private long numberc=Long.MIN_VALUE;
public long resendtimer;
public long getNumber() {
if(numberc!=Long.MIN_VALUE) {
return numberc;
@@ -188,7 +188,6 @@ public class DatagramKLALBPacketLink extends AbstractKLALBPacketLink implements
@Override
public void writePacket(ByteBuffer kp) throws IOException {
int length=kp.remaining();
incOutput(length);
kp.get(b,0,length);
DatagramPacket dp=new DatagramPacket(b,length);
ds.send(dp);
@@ -204,7 +203,6 @@ public class DatagramKLALBPacketLink extends AbstractKLALBPacketLink implements
dp=new DatagramPacket(c, c.length);
ds.receive(dp);
}
incInput(dp.getLength());
ByteBuffer bbf=NetworkPacket.bufferAllocator.allocate(dp.getLength());
bbf.put(dp.getData(),0,dp.getLength());
bbf.flip();
@@ -1,55 +0,0 @@
package org.kne.cloud.network.klalb;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.Objects;
import java.util.UUID;
public class IPSequence {
private UUID uuid;
private boolean isPromise;
public IPSequence(UUID uuid, boolean isPromise) {
super();
this.uuid = uuid;
this.isPromise = isPromise;
}
public UUID getUuid() {
return uuid;
}
public boolean isPromise() {
return isPromise;
}
@Override
public String toString() {
return "IPSequence [uuid=" + uuid + ", isPromise=" + isPromise + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
IPSequence other = (IPSequence) obj;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
}
File diff suppressed because it is too large Load Diff
@@ -23,6 +23,16 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
private List<MultipurposeSocketAddress>LineTable=new ArrayList<>();
private List<MultipurposeSocketAddress>ConnectLineTable=new ArrayList<>();
private List<MultipurposeSocketAddress>ntpServerTable=new ArrayList<>();
private boolean denyLineTableQuery=false;
private boolean denyLineTableBroadcast=false;
private String congestionAlgorithm="BBR";
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;
public void setNetworkInterfaceExcepts(List<String> networkInterfaceExcepts) {
NetworkInterfaceExcepts = networkInterfaceExcepts;
}
@@ -34,24 +44,6 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
public KLALBControllerConfigItem(String type, boolean nogui, String virtualAddress, Long virtualASN,
List<InetAddress> dNS, MultipurposeSocketAddress tCPListen, MultipurposeSocketAddress uDPListen,
String virtualSocketName, List<MultipurposeSocketAddress> lineTable,
List<MultipurposeSocketAddress> connectLineTable) {
super(type);
this.nogui = nogui;
VirtualAddress = virtualAddress;
VirtualASN = virtualASN;
DNS = dNS;
TCPListen = tCPListen;
UDPListen = uDPListen;
VirtualSocketName = virtualSocketName;
LineTable = lineTable;
ConnectLineTable = connectLineTable;
}
public List<String> getNetworkInterfaceExcepts() {
return NetworkInterfaceExcepts;
@@ -195,16 +187,126 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
this.ntpServerTable = ntpServerTable;
}
public String getCongestionAlgorithm() {
return congestionAlgorithm;
}
public void setCongestionAlgorithm(String congestionAlgorithm) {
this.congestionAlgorithm = congestionAlgorithm;
}
public double getDelayUpperBound() {
return delayUpperBound;
}
public void setDelayUpperBound(double delayUpperBound) {
this.delayUpperBound = delayUpperBound;
}
public double getDelayLowerBound() {
return delayLowerBound;
}
public void setDelayLowerBound(double delayLowerBound) {
this.delayLowerBound = delayLowerBound;
}
public boolean isDenyLineTableQuery() {
return denyLineTableQuery;
}
public void setDenyLineTableQuery(boolean denyLineTableQuery) {
this.denyLineTableQuery = denyLineTableQuery;
}
public boolean isDenyLineTableBroadcast() {
return denyLineTableBroadcast;
}
public void setDenyLineTableBroadcast(boolean denyLineTableBroadcast) {
this.denyLineTableBroadcast = denyLineTableBroadcast;
}
public long getNagleDelayTime() {
return nagleDelayTime;
}
public void setNagleDelayTime(long nagleDelayTime) {
this.nagleDelayTime = nagleDelayTime;
}
public int getLinkConnectionsCount() {
return linkConnectionsCount;
}
public void setLinkConnectionsCount(int linkConnectionsCount) {
this.linkConnectionsCount = linkConnectionsCount;
}
public long getLinkNagleDelayTime() {
return linkNagleDelayTime;
}
public void setLinkNagleDelayTime(long linkNagleDelayTime) {
this.linkNagleDelayTime = linkNagleDelayTime;
}
public String getTUNName() {
return TUNName;
}
public void setTUNName(String tUNName) {
TUNName = tUNName;
}
@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
+ ", NetworkInterfaceExcepts=" + NetworkInterfaceExcepts + "]";
+ ", denyLineTableQuery=" + denyLineTableQuery + ", denyLineTableBroadcast=" + denyLineTableBroadcast
+ ", congestionAlgorithm=" + congestionAlgorithm + ", delayUpperBound=" + delayUpperBound
+ ", delayLowerBound=" + delayLowerBound + ", nagleDelayTime=" + nagleDelayTime
+ ", linkNagleDelayTime=" + linkNagleDelayTime + ", linkConnectionsCount=" + linkConnectionsCount
+ ", TUNName=" + TUNName + ", NetworkInterfaceExcepts=" + NetworkInterfaceExcepts + "]";
}
@@ -218,11 +320,23 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
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;
@@ -264,6 +378,11 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
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;
@@ -284,11 +403,30 @@ public class KLALBControllerConfigItem extends KLALBConfigItem {
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) {
@@ -27,9 +27,10 @@ public class KLALBInputStream extends DataInputStream {
throw new StreamCorruptedException("no KLALB format");
}
int bv=readInt();
int mv=readInt();
int sv=readInt();
if(bv!=CONST.bversion)
throw new StreamCorruptedException("remote version is V"+bv+"."+sv+",not V"+CONST.klalbver);
if((bv!=CONST.bversion)||(mv!=CONST.mversion))
throw new StreamCorruptedException("remote version is V"+bv+"."+mv+",not V"+CONST.bversion+"."+CONST.mversion);
}
public KLALBPacket readKLALBPacket() throws IOException {
int len=readInt();
+41 -53
View File
@@ -19,22 +19,21 @@ import org.kne.cloud.network.SocketChannelListener;
import org.kne.cloud.network.SocketListener;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.RouteItem;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI2;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
import org.kne.cloud.network.klalb.ui.UIEnv;
import org.kne.cloud.network.perf.Kperf;
import org.kne.cloud.network.perf.MemcpyBenchmark;
import org.kne.cloud.network.perf.NodeBenchmark;
import org.kne.debug.Debuger;
import org.kne.debug.TimeDebugger;
import org.kne.membandboost.MembandBenchmark;
public class KLALBMain {
public static KLALBStateGUI3 ksg;
public static void main(String[] args) throws IOException {
try {
UIEnv.inituie();
}catch(Exception e) {
}catch(Throwable e) {
e.printStackTrace();
}
System.out.println(CONST.klalb+" V"+CONST.klalbver);
Scanner scn=new Scanner(System.in);
@@ -46,7 +45,9 @@ public class KLALBMain {
dtb.putTime("Create");
kpcje.loadConfigJson(configJson);
dtb.putTime("Load");
System.out.println("SRv6地址:"+kpcje.getKlalbController().getSelf().getAddress().getHostAddress());
System.out.println("=".repeat(65));
System.out.println(" - IPv6 Address / End SID: "+kpcje.getKlalbController().getSelf().getAddress());
System.out.println("=".repeat(65));
try {
if(!kpcje.getControllerConfig().isNogui())
openGUI(kpcje);
@@ -70,22 +71,28 @@ public class KLALBMain {
e.printStackTrace();
}
});
System.out.println("Done!");
while(true) {
System.out.print("KLALB>");
try {
String s=scn.nextLine();
String[]sc=s.trim().split(" ");
String tri=s.trim();
if(tri.isEmpty()) {
continue;
}
String[]sc=tri.split(" ");
switch(sc[0]) {
case "?":
case "help":
System.out.println("help:查看命令使用说明");
System.out.println("monitor:显示监视器图形界面");
System.out.println("lines-state:查看线路状态");
System.out.println("lines-add <地址:端口>:添加线路");
System.out.println("lines-remove <地址:端口>:删除线路");
System.out.println("lines-reconnect:所有离线线路立即尝试重连");
System.out.println("route:显示路由表");
System.out.println("kperf <地址:端口>:网络性能测试");
System.out.println("stop:退出程序");
System.out.println(" help / ?: see help");
System.out.println(" monitor: show monitor GUI");
System.out.println(" links-state: query link states");
System.out.println(" links-add <addr:port>: add link");
System.out.println(" links-remove <addr:port>: remove link");
System.out.println(" links-reconnect: reconnect all link");
System.out.println(" route: display internal route table");
System.out.println(" kperf <addr:port>: Porformance benchmark");
System.out.println(" exit: Exit");
break;
case "monitor":
@@ -95,8 +102,8 @@ public class KLALBMain {
e.printStackTrace();
}
break;
case "lines-state":
System.out.println("线路状态");
case "links-state":
System.out.println("links state");
System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
synchronized (kpcje.getKlalbController().getLines()) {
for (Iterator<IPv6NetworkLink> iterator = kpcje.getKlalbController().getLines().iterator(); iterator.hasNext();) {
@@ -108,7 +115,7 @@ public class KLALBMain {
}
}
break;
case "lines-add":
case "links-add":
if(sc.length>=2) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
List<KLALBRemoteLine>addl=kpcje.getKlalbController().addRemoteLines(mpsa);
@@ -125,39 +132,39 @@ public class KLALBMain {
System.out.println("请输入要添加地址:端口!");
}
break;
case "lines-remove":
case "links-remove":
if(sc.length>=2) {
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
List<KLALBRemoteLine>rmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
if(rmvl.isEmpty()) {
System.out.println("未找到匹配移除项");
System.out.println("No matched link has been found.");
}else {
for (Iterator iterator = rmvl.iterator(); iterator.hasNext();) {
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
System.out.println("移除成功:"+klalbRemoteLine.getMonitor().getName());
System.out.println("Successfully removed: "+klalbRemoteLine.getMonitor().getName());
}
}
}else {
System.out.println("请输入要添加地址:端口!");
System.out.println("Invalid arguments.");
}
break;
case "stop":
System.out.println("已退出程序");
case "exit":
System.out.println("Exited.");
System.exit(0);
break;
case "lines-reconnect":
System.out.println("尝试重连断开的线路");
case "links-reconnect":
System.out.println("Trying to reconnect all links.");
kpcje.getKlalbController().reconnectImmediately();
break;
case "route":
List<RouteItem> lri=new ArrayList<>( kpcje.getKlalbController().getIpv6Router().getCurrentRouteTabel());
Collections.sort(lri);
System.out.println("路由表:");
System.out.println("前缀\t协议\t优先级\t开销\t标志\t下一跳\t接口");
System.out.println("Route Table:");
System.out.println("Prefix\tProtocol\tPref\tCost\tFlag\tNext Hop\tInterface");
for (Iterator<RouteItem> iterator = lri.iterator(); iterator.hasNext();) {
RouteItem routeItem = (RouteItem) iterator.next();
System.out.println(routeItem.getDestination()+"\t"+routeItem.getProto()+"\t"+routeItem.getPre()+"\t"+routeItem.getCost()+"\t"+routeItem.getFlag()+"\t"+routeItem.getNexthop().getHostAddress()+"\t"+routeItem.getDestlink().getName());
System.out.println(routeItem.getDestination()+"\t"+routeItem.getProto()+"\t"+routeItem.getPre()+"\t"+routeItem.getCost()+"\t"+routeItem.getFlag()+"\t"+routeItem.getNexthop()+"\t"+routeItem.getDestlink().getName());
}
break;
@@ -167,31 +174,12 @@ public class KLALBMain {
Kperf kp=new Kperf(mpsa);
kp.startPerfing();
}else {
System.out.println("请输入测速服务端地址:端口!");
System.out.println("Invalid arguments.");
}
break;
case "memcpy":
System.out.println("数组拷贝测试");
for (int i = 0; i < 10; i++) {
MemcpyBenchmark. testArrayCopySpeed(256*1024*1024);
}
System.out.println("Bytebuffer拷贝测试");
for (int i = 0; i < 10; i++) {
MemcpyBenchmark.testByteBufferCopySpeed(256*1024*1024);
}
System.out.println("Directbytebuffer分配测试");
for (int i = 0; i < 10; i++) {
MemcpyBenchmark.testDirectByteBufferAllocateSpeed(65536);
}
System.out.println("Bytebuffer分配测试");
for (int i = 0; i < 10; i++) {
MemcpyBenchmark.testByteBufferAllocateSpeed(65536);
}
System.out.println("BytebufferAllocator分配测试");
for (int i = 0; i < 10; i++) {
MemcpyBenchmark.testByteBufferAllocatorSpeed(65536);
}
MembandBenchmark.main(args);
break;
//case "$$SYSTEM:":
//System.out.println();
@@ -205,13 +193,13 @@ public class KLALBMain {
nbc.startPerfing();
break;
default:
System.out.println("未知命令,请输入help以查询命令说明");
System.out.println("Unknown command. See \"help\" or \"?\".");
}
}catch (NoSuchElementException err) {
System.out.println("已退出程序");
System.out.println("Exited.");
System.exit(0);
}catch(RuntimeException e) {
System.out.println("错误!");
System.out.println("Exception Occured!");
e.printStackTrace();
}
}
@@ -17,6 +17,7 @@ public class KLALBOutputStream extends DataOutputStream {
byte[]b=new byte[] {'K','L','A','L','B'};
write(b);
writeInt(CONST.bversion);
writeInt(CONST.mversion);
writeInt(CONST.sversion);
flush();
}
@@ -63,10 +63,6 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
klalbHeader.put((byte) type);
this.headerLength=headerLength;
}
public KLALBPacket(int type,int headerLength, long priority) {
this(type,headerLength);
setPriority(priority);
}
@Override
public String toString() {
return "KLALBPacket [type=" + getType() + "]";
@@ -146,7 +142,7 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload {
public static KLALBPacket readKLALBPacketFromChannel(ReadableByteChannel in) throws IOException {
while(true) {
ByteBuffer bb=NetworkPacket.bufferAllocator.allocate(40);
ByteBuffer bb=NetworkPacket.bufferAllocator.allocate(64);
bb.position(0);
bb.limit(1);
while(bb.hasRemaining()){
@@ -10,20 +10,9 @@ import java.util.concurrent.atomic.LongAdder;
import org.kne.cloud.network.MultipurposeSocketAddress;
public interface KLALBPacketLink {
public void setOutputTrafficCounters(LongAdder[] al);
public void setOutputPacketsCounters(LongAdder[] longAdders);
public void setInputTrafficCounters(LongAdder[] longAdders);
public void setInputPacketsCounters(LongAdder[] al);
public void writePacket(ByteBuffer kp) throws IOException;
public default void writePackets(ByteBuffer[] kpp,int off,int len) throws IOException {
for (int i = 0; i < len; i++) {
writePacket(kpp[off+i]);
}
}
public void writeKLALBPacket(KLALBPacket kp) throws IOException;
public void flush() throws IOException;
public KLALBPacket readKLALBPacket()throws IOException;
public ByteBuffer readPacket()throws IOException;
public void close() throws IOException;
public boolean isClosed();
public void setSoTimeout(int val) throws SocketException;
@@ -31,6 +20,5 @@ public interface KLALBPacketLink {
@Override
public String toString();
public boolean isStream();
public void writeKLALBPackets(List<KLALBPacket> kp) throws IOException;
}
@@ -46,7 +46,7 @@ public class KLALBProtocolDetectSocketListener extends SocketListener {
if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) {
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new StreamKLALBPacketLink(pds));
krs = new KLALBRemoteLine(klalbController,new StreamKLALBPacketLink(pds));
klalbController.addRemoteLine(krs);
} catch (Exception e) {
e.printStackTrace();
@@ -24,7 +24,6 @@ import java.util.Map;
import java.util.Map.Entry;
import org.kne.cloud.network.*;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI2;
import org.kne.cloud.network.klalb.ui.KLALBStateGUI3;
import org.kne.cloud.network.klalb.ui.Language;
import org.kne.cloud.network.klalb.ui.UIEnv;
@@ -122,7 +121,6 @@ public class KLALBProxySystem {
}
public void loadConfigJson(JsonElement json) {
KLALBConfig config= gson.fromJson(json, KLALBConfig.class);
System.out.println(config);
loadConfig(config);
}
public void loadConfig(KLALBConfig config) {
@@ -141,31 +139,10 @@ public class KLALBProxySystem {
}
}
}
String vase= kcci.getVirtualAddress();
//System.out.println(vase);
List<InetAddress>daddr=new ArrayList<InetAddress>();
List<InetAddress> vdns= kcci.getDNS();
if(vdns!=null) {
for(InetAddress dnsaddr:vdns) {
daddr.add(dnsaddr);
}
}
if(vase!=null) {
try {
klalbController=new KLALBController((Inet6Address) InetAddress.getByName(vase),daddr);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}else {
klalbController=new KLALBController(daddr);
}
Long vasn= kcci.getVirtualASN();
if(vasn!=null) {
klalbController.getIpv6Router().setASN (vasn);
}
klalbController=new KLALBController(kcci);
String vsne=kcci.getVirtualSocketName();
@@ -183,7 +160,7 @@ public class KLALBProxySystem {
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc));
krs = new KLALBRemoteLine(klalbController,new StreamChannelKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
@@ -206,7 +183,7 @@ public class KLALBProxySystem {
KLALBRemoteLine krs=null;
try {
krs = new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(soc));
krs = new KLALBRemoteLine(klalbController,new SplitedDatagramKLALBPacketLink(soc));
klalbController.addRemoteLine(krs);
} catch (IOException e) {
e.printStackTrace();
@@ -219,33 +196,7 @@ public class KLALBProxySystem {
e1.printStackTrace();
}
}
List<MultipurposeSocketAddress> linele=kcci.getLineTable();
if(linele!=null) {
klalbController.getSelflineTable().addAll(linele);
}
List<MultipurposeSocketAddress> linetoc=kcci.getConnectLineTable();
if(linetoc!=null) {
linetoc.forEach((aline)->{
klalbController.addRemoteLines(aline);
});
}
List<MultipurposeSocketAddress> ntps=kcci.getNtpServerTable();
if(ntps!=null) {
klalbController.getNTPTable().addAll(ntps);
}
List<String> strexc=kcci.getNetworkInterfaceExcepts();
klalbController.getNetworkInterfaceExcept().clear();
if(strexc!=null) {
for(String strexci:strexc) {
try {
klalbController.getNetworkInterfaceExcept().add(NetworkInterface.getByName(strexci));
} catch (SocketException e) {
e.printStackTrace();
}
}
}
}else if(item instanceof SocketBridgeConfigItem) {
SocketBridgeConfigItem scci=(SocketBridgeConfigItem) item;
File diff suppressed because it is too large Load Diff
@@ -79,14 +79,11 @@ public class KLALBRemoteManagement {
jklbrl.addProperty("ipport", klalbRemoteLine.getSocketAddress().toString());
jklbrl.addProperty("state",MonitorData.parseStateToString( klalbRemoteLine.getMonitor().getState()));
jklbrl.addProperty("Vaddr", klalbRemoteLine.getRemoteVaddr().getAddress().getHostAddress());
jklbrl.addProperty("Vaddr", klalbRemoteLine.getRemoteVaddr().getAddress().toString());
jklbrl.addProperty("uploadspeed", klalbRemoteLine.getMonitor().getOutSpeed());
jklbrl.addProperty("downloadspeed", klalbRemoteLine.getMonitor().getInSpeed());
jklbrl.addProperty("uploadspeedavg", klalbRemoteLine.getMonitor().getOutSpeedAvg());
jklbrl.addProperty("downloadspeedavg", klalbRemoteLine.getMonitor().getInSpeedAvg());
jklbrl.addProperty("uploadtraffic", klalbRemoteLine.getMonitor().getOutTraffic());
jklbrl.addProperty("downloadtraffic", klalbRemoteLine.getMonitor().getInTraffic());
@@ -139,9 +136,6 @@ public class KLALBRemoteManagement {
jrsp.addProperty("uploadspeed", klalbProxySystem.getKlalbController().getLinkMonitor().getOutSpeed());
jrsp.addProperty("downloadspeed", klalbProxySystem.getKlalbController().getLinkMonitor().getInSpeed());
jrsp.addProperty("uploadspeedavg", klalbProxySystem.getKlalbController().getLinkMonitor().getOutSpeedAvg());
jrsp.addProperty("downloadspeedavg", klalbProxySystem.getKlalbController().getLinkMonitor().getInSpeedAvg());
jrsp.addProperty("uploadtraffic", klalbProxySystem.getKlalbController().getLinkMonitor().getOutTraffic());
jrsp.addProperty("downloadtraffic", klalbProxySystem.getKlalbController().getLinkMonitor().getInTraffic());
@@ -7,6 +7,7 @@ import java.io.IOException;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.SecureRandom;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue;
@@ -14,6 +15,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ipv6.IPv6Address;
public class KLALBUtils {
public static Inet6Address uuidToIP(UUID uuid) {
@@ -36,6 +38,18 @@ public class KLALBUtils {
}
return null;
}
public static IPv6Address randomKLALBIPv6Address() {
SecureRandom sc = new SecureRandom();
byte[] v = new byte[16];
sc.nextBytes(v);
v[0] = (byte) 0x24;
v[1] = (byte) 0x86;
v[2] = 0x00;
v[3] = 0x01;
return IPv6Address.valueOf(v);
}
public static void main(String[] args) {
System.out.println(uuidToIP(new UUID(-1,-1)));
}
@@ -366,6 +380,37 @@ public static String parseAbbrIPv6(String IPv6Str) {
}
return join(arr, ":").replaceAll(":{2,}", "::");
}
private static class UUIDGenarator{
private final long id;
private long counter=0;
private UUID randUUID=UUID.randomUUID();
private long time=System.nanoTime();
private static final long INTERVAL=1000000L;
public UUIDGenarator(long threadId) {
this.id=threadId;
}
public UUID genarateUUID() {
long curr=System.nanoTime();
if(curr-time>INTERVAL) {
time=curr;
randUUID=UUID.randomUUID();
}
long h=randUUID.getMostSignificantBits()^id;
long l=randUUID.getLeastSignificantBits()^counter;
UUID ret=new UUID(h, l);
counter++;
return ret;
}
}
private static ThreadLocal<UUIDGenarator> gens=ThreadLocal.withInitial(()->{
return new UUIDGenarator(Thread.currentThread().threadId());
});
public static UUID createGlobalUUID() {
//return UUID.randomUUID();
return gens.get().genarateUUID();
}
}
@@ -20,6 +20,7 @@ import java.util.concurrent.locks.LockSupport;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.VirtualDatagramSocketImpl;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6Packet;
import org.kne.cloud.network.tcp.UDPPacket;
import org.kne.concurrent.HighPerformanceExecutor;
@@ -82,7 +83,7 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
if (!(host instanceof Inet6Address)) {
throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 virtualaddress");
}
if ((!host.isAnyLocalAddress()) && (!host.equals(controller.getSelf().getAddress()))) {
if ((!host.isAnyLocalAddress()) && (!IPv6Address.valueOf( host).equals(controller.getSelf().getAddress()))) {
throw new BindException("must bind to self");
}
localaddr = (Inet6Address) host;
@@ -97,8 +98,9 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
UDPPacket udp=new UDPPacket(localPort, p.getPort());
udp.getData().put(p.getData(), p.getOffset(), p.getLength());
udp.getData().flip();
HighPerformanceExecutor.defaultExecutor.execute(() -> {
controller.sendPacketToAddress((Inet6Address) p.getAddress(),0, udp);
controller.getIpv6Router().enqueuePacketSendTask(()->{
IPv6Packet uip=controller.createPacketToAddress(IPv6Address.valueOf( p.getAddress()),0, udp);
return uip;
});
}
@@ -121,7 +123,7 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
}
private void copyTo(UDPPacket pack, DatagramPacket p) throws IOException {
p.setAddress(pack.getParent().getSourceAddress());
p.setAddress(pack.getParent().getSourceAddress2());
p.setPort(pack.getSrcPort());
ByteBuffer buffer= ByteBuffer.wrap(p.getData(),p.getOffset(),p.getLength());
@@ -216,7 +218,7 @@ public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl im
private Queue<UDPPacket> recvQueue = new ConcurrentLinkedQueue<UDPPacket>();
private AtomicInteger recvQueueUsed=new AtomicInteger(0);
@Override
public void accept(Inet6Address t,NetworkPacket np) {
public void accept(IPv6Address t,NetworkPacket np) {
UDPPacket u=(UDPPacket) np;
if(recvQueueUsed.get()<=inputchachesize) {
if(recvQueue.offer(u)) {
@@ -15,7 +15,9 @@ import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.kne.cloud.network.ByteBufferAllocator;
import org.kne.cloud.network.NetworkPacket;
@@ -24,7 +26,9 @@ import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.VirtualRawSocketImpl;
import org.kne.cloud.network.ipv6.IPv6Packet;
import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload;
import org.kne.cloud.network.ipv6.Inet6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink;
import org.kne.cloud.network.srv6.PacketConsumer;
import org.kne.cloud.network.srv6.SRv6Router;
@@ -139,8 +143,8 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
}
if (!address.isAnyLocalAddress() ) {
boolean contains=false;
for(Inet6AddressGroup adg:link.getAddressGroups()) {
if(adg.checkMatch((Inet6Address) address)) {
for(IPv6AddressGroup adg:link.getAddressGroups()) {
if(adg.checkMatch(IPv6Address.valueOf( address))) {
contains=true;
break;
}
@@ -187,14 +191,19 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
if(ipHeaderInclude) {
}else {
HighPerformanceExecutor.defaultExecutor.execute(() -> {
IPv6Payload pl=new IPv6Payload(bindProtocolNumber);
pl.getData().put(buf);
pl.getData().flip();
BiConsumer<IPv6NetworkLink, Supplier<IPv6Packet>>cons=link.getReceiveConsumer();
if(cons!=null) {
cons.accept(link,() -> {
IPv6Packet ipv=new IPv6Packet();
ipv.setVersion(6);
ipv.setTrafficClass(0);
ipv.setFlowLabel(0);
ipv.setHopLimit(255);
if(!localaddr.isAnyLocalAddress()) {
ipv.setSourceAddress(localaddr);
ipv.setSourceAddress2(localaddr);
}else {
ipv.setSourceAddress(link.getRouter().getLocator().getAddress());
}
@@ -202,24 +211,18 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
if (!(address instanceof Inet6Address)) {
throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 address");
}
ipv.setDestinationAddress((Inet6Address)address);
ipv.setPriority(3);
ipv.setDestinationAddress2((Inet6Address)address);
//ipv.enableECN();
IPv6Payload pl=new IPv6Payload(bindProtocolNumber);
pl.getData().put(buf);
pl.getData().flip();
ipv.setPayload(pl);
Consumer<IPv6Packet>cons=link.getReceiveConsumer();
if(cons!=null) {
cons.accept(ipv);
}
return ipv;
});
}
}
}
@Override
protected InetAddress peek() throws IOException {
return peekNextPacket().getSourceAddress();
return peekNextPacket().getSourceAddress2();
}
@Override
@@ -229,7 +232,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P
}
private void copyTo(IPv6Packet pack, DatagramPacket p) throws IOException {
p.setAddress(pack.getSourceAddress());
p.setAddress(pack.getSourceAddress2());
ByteBuffer buffer= ByteBuffer.wrap(p.getData(),p.getOffset(),p.getLength());
if(ipHeaderInclude) {
@@ -75,12 +75,7 @@ public class KLALBVirtualSocket extends VirtualSocket {
}
public void associateSocket(Socket associateSocket) throws IOException {
((KLALBVirtualSocketImpl)getVirtualImpl()).associateSocket(associateSocket);
}
public void associateSocketChannel(SocketChannel b) throws IOException{
((KLALBVirtualSocketImpl)getVirtualImpl()).associateSocketChannel(b);
}
@Override
public SocketChannel getChannel() {
return channel;
@@ -145,10 +145,6 @@ public class KLALBVirtualSocketChannel extends SocketChannel{
}
}
public void associateSocketChannel(SocketChannel b) throws IOException {
socket.associateSocketChannel(b);
}
public boolean isAutoFlush() throws IOException {
return ((KVSIOutputStream)socket.getOutputStream()).isAutoFlush();
}
File diff suppressed because it is too large Load Diff
@@ -1,14 +0,0 @@
package org.kne.cloud.network.klalb;
public class MemUseTest {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000);
Runtime r=Runtime.getRuntime();
System.out.println("total:"+r.totalMemory()+" max:"+r.maxMemory()+" free:"+r.freeMemory());
while(true) {
}
}
}
@@ -7,30 +7,36 @@ import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
import org.kne.cloud.network.FilterSocket;
import org.kne.cloud.network.monitor.MonitorData;
import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl;
public class MonitoredSocket extends FilterSocket {
public SpeedAndTrafficMonitorDataImpl getMonitor() {
return monitor;
}
private SpeedAndTrafficMonitorDataImpl monitor;
private LongAdder inMonitor;
private LongAdder outMonitor;
public LongAdder getInMonitor() {
return inMonitor;
}
public LongAdder getOutMonitor() {
return outMonitor;
}
@Override
public synchronized void close() throws IOException {
super.close();
}
public MonitoredSocket(Socket socket) {
this(socket,new SpeedAndTrafficMonitorDataImpl());
this(socket,new LongAdder(),new LongAdder());
}
public MonitoredSocket(Socket socket,SpeedAndTrafficMonitorDataImpl monitor) {
public MonitoredSocket(Socket socket,LongAdder inMonitor,LongAdder outMonitor) {
super(socket);
this.monitor=monitor;
this.inMonitor=inMonitor;
this.outMonitor=outMonitor;
}
@@ -41,14 +47,14 @@ public class MonitoredSocket extends FilterSocket {
@Override
public InputStream getInputStream() throws IOException {
if(in==null)
in=new MonitoredInputStream(socket.getInputStream(), monitor.getInTrafficAL());
in=new MonitoredInputStream(socket.getInputStream(), inMonitor);
return in;
}
@Override
public OutputStream getOutputStream() throws IOException {
if(out==null) {
out=new MonitoredOutputStream(socket.getOutputStream(), monitor.getOutTrafficAL());
out=new MonitoredOutputStream(socket.getOutputStream(), outMonitor);
}
return out;
}
@@ -9,16 +9,24 @@ import java.nio.ByteBuffer;
public class PINGPacket extends KLALBPacket {
private static final int HEADER_LENGTH=9;
private static final int HEADER_LENGTH=25;
public long getTime() {
return klalbHeader.getLong(17);
}
public long getUpSpeed() {
return klalbHeader.getLong(1);
}
public long getDownSpeed() {
return klalbHeader.getLong(9);
}
public PINGPacket(long time) {
super(PING,HEADER_LENGTH,-1);
public PINGPacket(long time,long upSpeed,long downSpeed) {
super(PING,HEADER_LENGTH);
klalbHeader.putLong(upSpeed);
klalbHeader.putLong(downSpeed);
klalbHeader.putLong(time);
}
public PINGPacket(ByteBuffer bb) {
+20 -12
View File
@@ -9,21 +9,27 @@ import java.nio.ByteBuffer;
public class PONGPacket extends KLALBPacket {
private static final int HEADER_LENGTH=25;
private static final int HEADER_LENGTH=41;
public long getTimepingsnd() {
return klalbHeader.getLong(1);
}
public long getTimepingrcv() {
return klalbHeader.getLong(9);
}
public long getTimepongsnd() {
return klalbHeader.getLong(17);
}
public long getTimepingrcv() {
return klalbHeader.getLong(25);
}
public long getTimepongsnd() {
return klalbHeader.getLong(33);
}
public long getUpSpeed() {
return klalbHeader.getLong(1);
}
public long getDownSpeed() {
return klalbHeader.getLong(9);
}
@Override
@@ -31,8 +37,10 @@ public class PONGPacket extends KLALBPacket {
return HEADER_LENGTH;
}
public PONGPacket( long timepingsnd,long timepingrcv, long timepongsnd) {
super(PONG,HEADER_LENGTH,-1);
public PONGPacket( long timepingsnd,long timepingrcv, long timepongsnd,long upSpeed,long downSpeed) {
super(PONG,HEADER_LENGTH);
klalbHeader.putLong(upSpeed);
klalbHeader.putLong(downSpeed);
klalbHeader.putLong(timepingsnd);
klalbHeader.putLong(timepingrcv);
klalbHeader.putLong(timepongsnd);
@@ -5,7 +5,8 @@ import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.ipv6.IPv6Address;
public interface PacketConsumer extends BiConsumer<Inet6Address, NetworkPacket> {
public interface PacketConsumer extends BiConsumer<IPv6Address, NetworkPacket> {
}
+21 -26
View File
@@ -18,29 +18,24 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.kne.cloud.network.IPv6SocketAddress;
import org.kne.cloud.network.NetworkPacket;
import org.kne.cloud.network.ipv6.IPv6Address;
import com.google.gson.internal.Pair;
public class PortBinder {
private static Inet6Address ANYLA;
static {
try {
ANYLA=(Inet6Address) Inet6Address.getByAddress(new byte[16]);
} catch (UnknownHostException e) {
}
}
private KLALBController controller;
public PortBinder(KLALBController controller) {
super();
this.controller = controller;
}
private ReentrantReadWriteLock bindMaplock=new ReentrantReadWriteLock();
private Map<InetSocketAddress,BindableKLALBPacketConsumer>bindMap=new ConcurrentHashMap<>(1024,0.2f);
private Map<IPv6SocketAddress,BindableKLALBPacketConsumer>bindMap=new ConcurrentHashMap<>(1024,0.2f);
private ReentrantReadWriteLock listenMaplock=new ReentrantReadWriteLock();
private Map<InetSocketAddress,BindableKLALBPacketConsumer>listenMap=new ConcurrentHashMap<>(1024,0.2f);
private Map<IPv6SocketAddress,BindableKLALBPacketConsumer>listenMap=new ConcurrentHashMap<>(1024,0.2f);
private ReentrantReadWriteLock connectMaplock=new ReentrantReadWriteLock();
private Map<Pair<InetSocketAddress,InetSocketAddress>,BindableKLALBPacketConsumer>connectMap=new ConcurrentHashMap<>(1024,0.2f);
private Map<Pair<IPv6SocketAddress,IPv6SocketAddress>,BindableKLALBPacketConsumer>connectMap=new ConcurrentHashMap<>(1024,0.2f);
private volatile int portn=65535;
public void bind(BindableKLALBPacketConsumer ks) throws BindException {
bindMaplock.writeLock().lock();
@@ -64,10 +59,10 @@ public class PortBinder {
}
}
boolean flag=true;
for (Iterator<InetSocketAddress> iterator = bindMap.keySet().iterator(); iterator.hasNext();) {
InetSocketAddress bindableKLALBPacketConsumer = (InetSocketAddress) iterator
for (Iterator<IPv6SocketAddress> iterator = bindMap.keySet().iterator(); iterator.hasNext();) {
IPv6SocketAddress bindableKLALBPacketConsumer = (IPv6SocketAddress) iterator
.next();
if(Objects.equals(ks.getLocalInetAddress(), bindableKLALBPacketConsumer.getAddress())&&portn==bindableKLALBPacketConsumer.getPort()) {
if(Objects.equals(IPv6Address.valueOf( ks.getLocalInetAddress()), bindableKLALBPacketConsumer.getAddress())&&portn==bindableKLALBPacketConsumer.getPort()) {
flag=false;
break;
}
@@ -77,15 +72,15 @@ public class PortBinder {
}
ks.setLocalPort(portn);
}else {
for (Iterator<InetSocketAddress> iterator = bindMap.keySet().iterator(); iterator.hasNext();) {
InetSocketAddress bindableKLALBPacketConsumer = (InetSocketAddress) iterator
for (Iterator<IPv6SocketAddress> iterator = bindMap.keySet().iterator(); iterator.hasNext();) {
IPv6SocketAddress bindableKLALBPacketConsumer = (IPv6SocketAddress) iterator
.next();
if(Objects.equals(ks.getLocalInetAddress(), bindableKLALBPacketConsumer.getAddress())&&pold==bindableKLALBPacketConsumer.getPort()) {
if(Objects.equals(IPv6Address.valueOf( ks.getLocalInetAddress()), bindableKLALBPacketConsumer.getAddress())&&pold==bindableKLALBPacketConsumer.getPort()) {
throw new BindException("port " + pold + " is already bind!");
}
}
}
bindMap.put(new InetSocketAddress(ks.getLocalInetAddress(), ks.getLocalPort()),ks);
bindMap.put(new IPv6SocketAddress(IPv6Address.valueOf( ks.getLocalInetAddress()), ks.getLocalPort()),ks);
}finally {
bindMaplock.writeLock().unlock();
}
@@ -102,7 +97,7 @@ public class PortBinder {
public void connect(BindableKLALBPacketConsumer ks) throws BindException {
connectMaplock.writeLock().lock();
try {
connectMap.put(new Pair<InetSocketAddress, InetSocketAddress>( new InetSocketAddress(ks.getLocalInetAddress(), ks.getLocalPort()), new InetSocketAddress(ks.getRemoteInetAddress(), ks.getPort())),ks);
connectMap.put(new Pair<IPv6SocketAddress, IPv6SocketAddress>( new IPv6SocketAddress(IPv6Address.valueOf(ks.getLocalInetAddress()), ks.getLocalPort()), new IPv6SocketAddress(IPv6Address.valueOf(ks.getRemoteInetAddress()), ks.getPort())),ks);
}finally {
connectMaplock.writeLock().unlock();
}
@@ -119,7 +114,7 @@ public class PortBinder {
public void listen(BindableKLALBPacketConsumer ks) throws BindException {
listenMaplock.writeLock().lock();
try {
listenMap.put(new InetSocketAddress(ks.getLocalInetAddress(), ks.getLocalPort()),ks);
listenMap.put(new IPv6SocketAddress(IPv6Address.valueOf(ks.getLocalInetAddress()), ks.getLocalPort()),ks);
}finally {
listenMaplock.writeLock().unlock();
}
@@ -206,16 +201,16 @@ public class PortBinder {
}
return b;
}*/
public boolean distributePacketToConsumer(Inet6Address srcAddr,PortPacket packet) {
InetSocketAddress local=new InetSocketAddress(controller.getSelf().getAddress(), packet.getDstPort());
InetSocketAddress remote=new InetSocketAddress(srcAddr, packet.getSrcPort());
BindableKLALBPacketConsumer bkc=connectMap.get(new Pair<InetSocketAddress, InetSocketAddress>(local, remote));
public boolean distributePacketToConsumer(IPv6Address srcAddr,PortPacket packet) {
IPv6SocketAddress local=new IPv6SocketAddress(controller.getSelf().getAddress(), packet.getDstPort());
IPv6SocketAddress remote=new IPv6SocketAddress(srcAddr, packet.getSrcPort());
BindableKLALBPacketConsumer bkc=connectMap.get(new Pair<IPv6SocketAddress, IPv6SocketAddress>(local, remote));
if(bkc!=null) {
bkc.accept(srcAddr, (NetworkPacket) packet);
return true;
}
InetSocketAddress localany=new InetSocketAddress(ANYLA, packet.getDstPort());
bkc=connectMap.get(new Pair<InetSocketAddress, InetSocketAddress>(localany, remote));
IPv6SocketAddress localany=new IPv6SocketAddress(IPv6Address.UNSPECIFIED, packet.getDstPort());
bkc=connectMap.get(new Pair<IPv6SocketAddress, IPv6SocketAddress>(localany, remote));
if(bkc!=null) {
bkc.accept(srcAddr, (NetworkPacket) packet);
return true;
@@ -239,7 +234,7 @@ public class PortBinder {
return bindMap.containsValue(klalbVirtualSocketImpl);
}
public boolean checkIsConnect(BindableKLALBPacketConsumer kservers,InetSocketAddress isaf) throws BindException {
return connectMap.containsKey(new Pair<InetSocketAddress, InetSocketAddress>( new InetSocketAddress(kservers.getLocalInetAddress(), kservers.getLocalPort()),isaf));
return connectMap.containsKey(new Pair<IPv6SocketAddress, IPv6SocketAddress>( new IPv6SocketAddress(IPv6Address.valueOf( kservers.getLocalInetAddress()), kservers.getLocalPort()),IPv6SocketAddress.valueOf( isaf)));
}
}
@@ -5,8 +5,8 @@ import org.kne.cloud.network.ipv6.IPv6Packet;
public class SendItem<T extends NetworkPacket> {
private long packetLength;
private T packet;
private final long packetLength;
private final T packet;
private long sendtime=System.nanoTime();
public SendItem(T packet) {
@@ -25,5 +25,9 @@ public class SendItem<T extends NetworkPacket> {
public long getPacketLength() {
return packetLength;
}
public void setSendtime(long sendtimex) {
this.sendtime=sendtimex;
}
}
@@ -105,7 +105,7 @@ public class SocketBridgeConfigItem extends KLALBConfigItem {
if(string.startsWith("SocketBridge")) {
return new DefaultSocketBridgeFactory();
}else if(string.startsWith("MinecraftSocketBridge")) {
return new DefaultMinecraftSocketBridgeFactory(controller.getSelf().getAddress(), Integer.parseInt(string.substring(21)));
return new DefaultMinecraftSocketBridgeFactory(controller.getSelf().getAddress().toInet6Address(), Integer.parseInt(string.substring(21)));
}
throw new IllegalArgumentException("unknown SocketBridge type:"+string);
}
@@ -342,7 +342,6 @@ public class SplitedDatagramKLALBPacketLink extends AbstractKLALBPacketLink impl
@Override
public void writePacket(ByteBuffer kp) throws IOException {
incOutput(kp.remaining());
pslr.write(kp);
}
@@ -351,7 +350,6 @@ public class SplitedDatagramKLALBPacketLink extends AbstractKLALBPacketLink impl
ByteBuffer bbf=NetworkPacket.bufferAllocator.allocate(65535);
pbdr.read(bbf );
bbf.flip();
incInput(bbf.remaining());
return bbf;
}
@@ -37,6 +37,7 @@ import org.kne.cloud.network.TimeoutTimer;
import org.kne.io.KNEChannels;
public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink {
private static final boolean debug = false;
private volatile long timeoutTimer;
private volatile boolean timerenabled=false;
private boolean enableBuffer=true;
@@ -126,6 +127,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
@Override
public void flush() throws IOException {
checkflush();
}
@Override
@@ -140,7 +142,6 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
incOutput(kp.limit());
szeWrite.putInt(kp.limit());
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
@@ -150,42 +151,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
}
private ByteBuffer[] bbfwx=new ByteBuffer[100<<1];
{
for(int i=0;i<100;i++) {
bbfwx[i<<1]=NetworkPacket.bufferAllocator.allocate(4);
}
}
@Override
public void writePackets(ByteBuffer[] kpp,int off,int len) throws IOException {
if(len>100) {
ByteBuffer[] bbfw=new ByteBuffer[len<<1];
for(int i=0;i<len;i++) {
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
//szeWrite.clear();
incOutput(kpp[off+i].limit());
szeWrite.putInt(kpp[off+i].limit());
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
bbfw[i<<1]=szeWrite;
bbfw[(i<<1)+1]=kpp[off+i];
}
writableChannel.write(bbfw);
}else {
for(int i=0;i<len;i++) {
bbfwx[i<<1].clear();
bbfwx[i<<1].limit(4);
incOutput(kpp[off+i].limit());
bbfwx[i<<1].putInt(kpp[off+i].limit());
bbfwx[i<<1].flip();
bbfwx[(i<<1)+1]=kpp[off+i];
}
writableChannel.write(bbfwx,0,len<<1);
}
checkflush();
}
@Override
@@ -203,7 +169,6 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
szeRead.flip();
int size=szeRead.getInt(0);
kp=NetworkPacket.bufferAllocator.allocate(size);
incInput(size);
kp.limit(size);
KNEChannels.readFully(readableChannel, kp);
kp.flip();
@@ -213,41 +178,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
}
}
@Override
public void writeKLALBPackets(List<KLALBPacket> pkts) throws IOException {
KLALBVirtualSocketChannel obj = null;
if(writableChannel instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) writableChannel;
}
boolean isaflush=false;
if(obj!=null) {
isaflush=obj.isAutoFlush();
obj.setAutoFlush(false);
}
ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4);
szeWrite.limit(4);
for(KLALBPacket kp:pkts) {
szeWrite.clear();
int length=(int) kp.getTotalLength();
incOutput(length);
szeWrite.putInt(length);
szeWrite.flip();
writableChannel.write(szeWrite);
KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp);
}
if(obj!=null) {
obj.flush();
}
checkflush();
if(obj!=null) {
obj.setAutoFlush(isaflush);
}
}
@Override
@@ -257,35 +188,25 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
szeWrite.limit(4);
//szeWrite.clear();
int length=(int) kp.getTotalLength();
incOutput(length);
szeWrite.putInt(length);
szeWrite.flip();
KLALBVirtualSocketChannel obj = null;
if(writableChannel instanceof KLALBVirtualSocketChannel) {
obj=(KLALBVirtualSocketChannel) writableChannel;
}
boolean isaflush=false;
if(obj!=null) {
isaflush=obj.isAutoFlush();
obj.setAutoFlush(false);
}
writableChannel.write(szeWrite);
if(debug) {
AtomicLong al=new AtomicLong(0);
KLALBPacket.writeKLALBPacketToChannel(new MonitoredChannel(writableChannel,null,new AtomicLong[] { al}), kp);
if(length!=al.get()) {
throw new StreamCorruptedException(kp+" packet length error:"+al.get()+"!="+length);
}
}else {
KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp);
}
KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp);
if(obj!=null) {
obj.flush();
}
checkflush();
/*AtomicLong al=new AtomicLong(0);
KLALBPacket.writeKLALBPacketToChannel(new MonitoredChannel(connectSocket,null,new AtomicLong[] { al}), kp);
if(length!=al.get()) {
throw new StreamCorruptedException(kp+" packet length error:"+al.get()+"!="+length);
}*/
if(obj!=null) {
obj.setAutoFlush(isaflush);
}
}
private void checkflush() throws IOException {
@@ -302,13 +223,13 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem
KNEChannels.readFully(readableChannel, szeWrite);
szeWrite.flip();
int readSize=szeWrite.getInt();
incInput(readSize);
KLALBPacket kp=KLALBPacket.readKLALBPacketFromChannel(readableChannel);
/*
long kpl=kp.getLength();
if(debug) {
long kpl=kp.getTotalLength();
if(kpl!=readSize) {
throw new StreamCorruptedException(kp+" packet length error:"+kpl+"!="+readSize);
}*/
}
}
return kp;
}
@@ -9,24 +9,23 @@ import java.net.Inet6Address;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import org.kne.cloud.network.ipv6.Inet6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
public class VADDRPacket extends KLALBPacket {
private static final int HEADER_LENGTH=18;
public Inet6AddressGroup getVaddr() {
byte[]b=new byte[16];
klalbHeader.get(1, b);
try {
return new Inet6AddressGroup( (Inet6Address) Inet6Address.getByAddress(b),klalbHeader.get(17)&0xff);
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
public IPv6AddressGroup getVaddr() {
long high=klalbHeader.getLong(1);
long low=klalbHeader.getLong(9);
int perf=klalbHeader.get(17)&0xff;
return new IPv6AddressGroup(new IPv6Address(high, low), perf);
}
public VADDRPacket(Inet6AddressGroup vaddr) {
public VADDRPacket(IPv6AddressGroup vaddr) {
super(VADDR,HEADER_LENGTH);
klalbHeader.put(1, vaddr.getAddress().getAddress());
klalbHeader.putLong(1, vaddr.getAddress().getHigh());
klalbHeader.putLong(9, vaddr.getAddress().getLow());
klalbHeader.put(17,(byte) vaddr.getPrefixLength());
}
@@ -0,0 +1,140 @@
package org.kne.cloud.network.klalb.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.dial.DialPlot;
import org.jfree.chart.plot.dial.DialPointer;
import org.jfree.chart.plot.dial.DialTextAnnotation;
import org.jfree.chart.plot.dial.StandardDialFrame;
import org.jfree.chart.plot.dial.StandardDialRange;
import org.jfree.chart.plot.dial.StandardDialScale;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultValueDataset;
public class DialPanel extends JPanel {
private DialTextAnnotation textAnnotation;
private DialPlot plot;
public DialPanel(int size,String title,DefaultValueDataset primary, DefaultValueDataset secondary,
Color pointerColor, Color outlineColor) {
plot=createDialPlot(primary,secondary,pointerColor,outlineColor);
textAnnotation = new DialTextAnnotation("");
textAnnotation.setFont(UIEnv.getFont().deriveFont(20.0f));
plot.addLayer(textAnnotation);
setLayout(new BorderLayout());
add(createChartPanel (createChart(plot),new Dimension(size, size)),BorderLayout.CENTER);
JLabel jlb=new JLabel(title);
jlb.setFont(UIEnv.getFont().deriveFont(16.0f));
jlb.setHorizontalAlignment(SwingConstants.CENTER);
add(jlb,BorderLayout.SOUTH);
}
public DialTextAnnotation getTextAnnotation() {
return textAnnotation;
}
/**
* 创建图表面板
* @param dashSize
*/
private ChartPanel createChartPanel(JFreeChart chart, Dimension dashSize) {
ChartPanel panel = new ChartPanel(chart);
panel.setPreferredSize(dashSize);
panel.setSize(panel.getPreferredSize());
panel.setBackground(Color.WHITE);
panel.setBorder(new LineBorder(Color.LIGHT_GRAY));
return panel;
}
/**
* 创建图表
*/
private JFreeChart createChart(DialPlot plot) {
JFreeChart chart = new JFreeChart(plot);
chart.setBorderPaint(Color.WHITE);
chart.setTitle((TextTitle)null);
plot.setView(0, 0, 1, 1);
return chart;
}
/**
* 创建仪表盘图表
*/
private DialPlot createDialPlot(DefaultValueDataset primary, DefaultValueDataset secondary,
Color pointerColor, Color outlineColor) {
DialPlot plot = new DialPlot();
plot.setDataset(1, primary);
plot.setDataset(0, secondary);
StandardDialFrame frame = new StandardDialFrame();
frame.setVisible(false);
plot.setDialFrame(frame);
// 添加刻度
StandardDialScale scale = new StandardDialScale(0, 100, -120, -300, 10, 5);
scale.setTickRadius(0.80);
scale.setTickLabelsVisible(false);
plot.addScale(0, scale);
// 添加指针
addDialPointers(plot, pointerColor, outlineColor);
return plot;
}
/**
* 为仪表盘添加颜色范围
*/
public void addDefaultDialRanges() {
// 绿色范围: 0-70%
StandardDialRange greenRange = new StandardDialRange(0, 70, Color.GREEN);
addDialRange( greenRange);
// 黄色范围: 70-90%
StandardDialRange yellowRange = new StandardDialRange(70, 90, Color.YELLOW);
addDialRange( yellowRange);
// 红色范围: 90-100%
StandardDialRange redRange = new StandardDialRange(90, 100, Color.RED);
addDialRange( redRange);
}
private static final double INNER=0.85;
private static final double OUTER=0.90;
public void addDialRange( StandardDialRange greenRange) {
greenRange.setInnerRadius(INNER);
greenRange.setOuterRadius(OUTER);
plot.addLayer(greenRange);
}
/**
* 为仪表盘添加指针
*/
private void addDialPointers(DialPlot plot, Color primaryColor, Color secondaryColor) {
// 次要指针透明
DialPointer.Pointer secondaryPointer = new DialPointer.Pointer();
secondaryPointer.setRadius(0.8);
secondaryPointer.setFillPaint(new Color(secondaryColor.getRed(), secondaryColor.getGreen(),
secondaryColor.getBlue(), 0));
secondaryPointer.setOutlinePaint(secondaryColor);
secondaryPointer.setDatasetIndex(0);
plot.addLayer(secondaryPointer);
// 主要指针
DialPointer.Pointer primaryPointer = new DialPointer.Pointer();
primaryPointer.setRadius(0.8);
primaryPointer.setFillPaint(primaryColor);
primaryPointer.setOutlinePaint(primaryColor);
primaryPointer.setDatasetIndex(1);
plot.addLayer(primaryPointer);
}
}
@@ -1,7 +0,0 @@
package org.kne.cloud.network.klalb.ui;
import org.jfree.chart.ChartPanel;
public class Dials {
}
@@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.klalb.KLALBUtils;
import org.kne.cloud.network.srv6.KLALBRoutingProtocol.LinkDirection;
@@ -110,10 +111,10 @@ public class GraphPanel extends JPanel {
private Map<Inet6Address,GraphNode> nodes=new ConcurrentHashMap<Inet6Address,GraphNode>();
private Map<IPv6Address,GraphNode> nodes=new ConcurrentHashMap<IPv6Address,GraphNode>();
private List<GraphEdgeGroup> edgeGroups=new ArrayList<GraphEdgeGroup>();
public Map<Inet6Address, GraphNode> getNodes() {
public Map<IPv6Address, GraphNode> getNodes() {
return nodes;
}
@@ -1,200 +0,0 @@
package org.kne.cloud.network.klalb.ui;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Component;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import org.kne.cloud.network.ipv6.IPv6NetworkLink;
import org.kne.cloud.network.klalb.CONST;
import org.kne.cloud.network.klalb.KLALBController;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.ui.XFrame;
import org.kne.ui.YScrollPane;
public class KLALBStateGUI extends XFrame {
private BufferedImage bi;
private TimerTask tsk;
private SystemTray st;
private TrayIcon ti;
public KLALBStateGUI(KLALBController kpcje) throws IOException {
this(kpcje ,CONST.klalb+" network accelerator V"+CONST.klalbver);
}
public KLALBStateGUI(KLALBController kc,String title) throws IOException {
setResizable(false);
try {
bi = ImageIO.read(KLALBStateGUI.class.getResourceAsStream("/assets/KNEL.png"));
} catch (IOException e) {
e.printStackTrace();
}
if(bi!=null)
setIconImage(bi);
setTitleColor(new Color(255, 255, 255, 250));
//getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f));
getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY));
/*
setTitleColor(new Color(0,0,0,80));
getContentPane().setBackground(new Color(0,0,0,80));
getTitlelabel().setForeground(Color.WHITE);*/
YScrollPane ysp = new YScrollPane(660);
ysp.setOpaque(false);
getContentPane().add(ysp);
JPanel wv = ysp.getView();
/*JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);
progressBar.setForeground(Color.YELLOW);
progressBar.setBorder(null);
progressBar.setPreferredSize(new Dimension(100, 4));
ysp.add(progressBar, BorderLayout.NORTH);*/
wv.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void componentResized(ComponentEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void componentMoved(ComponentEvent e) {
repaint();
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO 自动生成的方法存根
}
});
setTitle(title);
setSize(680, 430);
setLocationRelativeTo(null);
//setVisible(true);
if (SystemTray.isSupported()) {
st = SystemTray.getSystemTray();
ti = new TrayIcon(bi);
ti.setImageAutoSize(true);
PopupMenu jpm = new PopupMenu();
MenuItem mix = new MenuItem("open");
mix.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(true);
}
});
jpm.add(mix);
MenuItem mi = new MenuItem("exit");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close();
}
});
jpm.add(mi);
ti.setPopupMenu(jpm);
try {
st.add(ti);
} catch (AWTException e1) {
e1.printStackTrace();
}
ti.addActionListener((x) -> {
setVisible(true);
});
}
repaint();
/*progressBar.setIndeterminate(false);
progressBar.setValue(100);
progressBar.setForeground(Color.GREEN);*/
Timer t= new Timer("状态刷新线程",true);
tsk=new TimerTask() {
@Override
public void run() {
synchronized (kc.getLines()) {
loop:for (Iterator<IPv6NetworkLink> iterator = kc.getLines().iterator(); iterator.hasNext();) {
IPv6NetworkLink link=iterator.next();
if(link instanceof KLALBRemoteLine) {
KLALBRemoteLine ent = (KLALBRemoteLine)link ;
Component[] count=ysp.getView().getComponents();
for (int i = 0; i < count.length; i++) {
Component tp=count[i];
if(tp instanceof TPanel) {
if(((TPanel) tp).getTunnel().equals(ent)) {
continue loop;
}
}
}
TPanel tp=new TPanel(ent);
ysp.getView().add(tp);
}
}
Component[] count=ysp.getView().getComponents();
for (int i = 0; i < count.length; i++) {
Component tp=count[i];
if(tp instanceof TPanel) {
if(kc.getLines().contains(((TPanel) tp).getTunnel())) {
((TPanel) tp).updateTraffic();
}else {
ysp.getView().remove(tp);
}
}
}
}
repaint();
}
};
t.schedule(tsk, 500, 500);
}
public void close() {
setVisible(false);
if(tsk!=null) {
tsk.cancel();
}
st.remove(ti);
}
public static void main(String[] args) throws IOException, InterruptedException {//,new MultipurposeSocketAddress("frp-mom.top:22226"),new MultipurposeSocketAddress("0.0.0.0:26468")
KLALBStateGUI kcg=new KLALBStateGUI(new KLALBController());
kcg.setVisible(true);
//Thread.sleep(10000);
//kcg.close();
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -18,7 +18,7 @@ import org.jfree.chart.ui.RectangleEdge;
import org.jfree.data.general.DefaultValueDataset;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.klalb.KLALBUtils;
import org.kne.cloud.network.monitor.QueueingMonitorDataImpl;
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
import org.kne.cloud.network.perf.Kperf;
import org.kne.cloud.network.perf.KperfReports;
import org.kne.ui.XFrame;
@@ -65,7 +65,7 @@ public class KperfGUI extends XFrame{
private DialTextAnnotation downSpeedText;
private JTextField sourceAddressField;
private QueueingMonitorDataImpl monitor;
private SpeedAndTrafficAndDelayMonitorDataImpl monitor;
private DefaultValueDataset upPPS;
@@ -94,7 +94,7 @@ public class KperfGUI extends XFrame{
updateButton();
}
@Override
public void updateDial(QueueingMonitorDataImpl mdt) {
public void updateDial(SpeedAndTrafficAndDelayMonitorDataImpl mdt) {
monitor=mdt;
}
@Override
@@ -504,27 +504,27 @@ public class KperfGUI extends XFrame{
@Override
public void run() {
if(monitor!=null) {
double outload = monitor.getOutSpeed() * 100.0 / monitor.getOutSpeedMax2();
double outload = monitor.getOutSpeed() * 100.0 / monitor.getOutSpeedMax();
if (Double.isFinite(outload)) {
upSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getOutSpeedAvg()) + "/s");
upSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getOutSpeed()) + "/s");
upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0));
}
double inload = monitor.getInSpeed() * 100.0 / monitor.getInSpeedMax2();
double inload = monitor.getInSpeed() * 100.0 / monitor.getInSpeedMax();
if (Double.isFinite(inload)) {
downSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getInSpeedAvg()) + "/s");
downSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getInSpeed()) + "/s");
downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0));
}
double outPPSload = monitor.getOutPPS() * 100.0 / monitor.getOutPPSMax2();
double outPPSload = monitor.getOutPPS() * 100.0 / monitor.getOutPPSMax();
if (Double.isFinite(outPPSload)) {
upPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getOutPPSAvg()) + "PPS");
upPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getOutPPS()) + "PPS");
upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0));
}
double inPPSload = monitor.getInPPS() * 100.0 / monitor.getInPPSMax2();
double inPPSload = monitor.getInPPS() * 100.0 / monitor.getInPPSMax();
if (Double.isFinite(inPPSload)) {
downPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getInPPSAvg()) + "PPS");
downPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getInPPS()) + "PPS");
downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0));
}
}
@@ -28,9 +28,12 @@ import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.time.TimePeriod;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.kne.cloud.network.ipv6.Inet6AddressGroup;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.cloud.network.monitor.MonitorData;
import org.kne.cloud.network.monitor.TimestampMonitorValue;
import org.kne.math.Long128;
import org.kne.ui.XFrame;
import java.awt.BasicStroke;
@@ -48,186 +51,186 @@ import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JSlider;
public class LineMonitorGUI extends XFrame{
public class LineMonitorGUI extends XFrame {
private Timer timer;
private Timer timer1;
private Timer timer2;
private TimerTask tsk3 ;
private TimerTask tsk3;
private TimerTask tsk4, tsk5;
private TimerTask d1;
private TimerTask d2;
private TimeSeries spdup = new TimeSeries(UIEnv.getRsb().getString("uploadspeed"));
private TimeSeries spddown = new TimeSeries(UIEnv.getRsb().getString("downloadspeed"));
private TimeSeries delayup = new TimeSeries(UIEnv.getRsb().getString("uploaddelay"));
private TimeSeries delaydown = new TimeSeries(UIEnv.getRsb().getString("downloaddelay"));
// private TimeSeries delayupmin=new TimeSeries("Upload delay minimum");
// private TimeSeries delaydownmin=new TimeSeries("Download delay minimum");
private TimerTask tsk4 ,tsk5;
private TimerTask d1 ;
private TimerTask d2 ;
private TimeSeries spdup=new TimeSeries(UIEnv.getRsb().getString("uploadspeed"));
private TimeSeries spddown=new TimeSeries(UIEnv.getRsb().getString("downloadspeed"));
private TimeSeries delayup=new TimeSeries(UIEnv.getRsb().getString("uploaddelay"));
private TimeSeries delaydown=new TimeSeries(UIEnv.getRsb().getString("downloaddelay"));
//private TimeSeries delayupmin=new TimeSeries("Upload delay minimum");
//private TimeSeries delaydownmin=new TimeSeries("Download delay minimum");
private KLALBRemoteLine tr;
private JTextField vaddrs;
private JFreeChart jfc;
private JFreeChart jfce;
private JLabel spdp;
private JLabel delp;
private long timeRange=5000;
private long[]values=new long[] {1000,2000,5000,10000,20000,50000,100000,200000,500000,1000000};
private long timeRange = 5000;
private long[] values = new long[] { 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000 };
private JPanel panel_1;
private JLabel lblNewLabel;
//private ChartPanel delp;
//private ChartPanel spdp;
// private ChartPanel delp;
// private ChartPanel spdp;
public LineMonitorGUI(KLALBRemoteLine t) {
this.tr=t;
this.tr = t;
setSize(1200, 780);
setLocationRelativeTo(null);
setIconImage(UIEnv.getIcon());
setTitle("Line Monitor:"+t.getMonitor().getName());
setTitle("Line Monitor:" + t.getMonitor().getName());
setTitleColor(UIEnv.getDefaultTitleColor());
getContentPane().setBackground(UIEnv.getDefaultBackgroundColor());
getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f));
getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY));
JPanel jp=new JPanel();
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(2, 1));
getContentPane().add(jp);
TimeSeriesCollection tsc=new TimeSeriesCollection();
TimeSeriesCollection tsc = new TimeSeriesCollection();
tsc.addSeries(spdup);
tsc.addSeries(spddown);
jfc = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("speermonitor"), UIEnv.getRsb().getString("time")+"(s)", UIEnv.getRsb().getString("speed")+"(KiB/s)", tsc);
jfc = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("speermonitor"),
UIEnv.getRsb().getString("time") + "(s)", UIEnv.getRsb().getString("speed") + "(KiB/s)", tsc);
jfc.getXYPlot().setBackgroundPaint(Color.BLACK);
jfc.getXYPlot().getRenderer().setSeriesPaint(0,Color.RED);
jfc.getXYPlot().getRenderer().setSeriesPaint(1,Color.GREEN);
jfc.getXYPlot().getRenderer().setSeriesPaint(0, Color.RED);
jfc.getXYPlot().getRenderer().setSeriesPaint(1, Color.GREEN);
changeFont(jfc);
spdp = new JLabel();
spdp.setBorder(new LineBorder(Color.DARK_GRAY));
jp.add(spdp);
TimeSeriesCollection tsce=new TimeSeriesCollection();
TimeSeriesCollection tsce = new TimeSeriesCollection();
tsce.addSeries(delayup);
tsce.addSeries(delaydown);
//tsce.addSeries(delayupmin);
//tsce.addSeries(delaydownmin);
jfce = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("delaymonitor"), UIEnv.getRsb().getString("time")+"(s)", UIEnv.getRsb().getString("delay")+"(ms)", tsce);
jfce.getXYPlot().setBackgroundPaint(Color.BLACK);
jfce.getXYPlot().getRenderer().setSeriesPaint(0,Color.RED);
jfce.getXYPlot().getRenderer().setSeriesPaint(1,Color.GREEN);
BasicStroke dotted = new BasicStroke(2, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 0, new float[]{0,6,0,6}, 0);
/*jfce.getXYPlot().getRenderer().setSeriesPaint(2,Color.RED);
jfce.getXYPlot().getRenderer().setSeriesStroke(2, dotted);
jfce.getXYPlot().getRenderer().setSeriesPaint(3,Color.GREEN);
jfce.getXYPlot().getRenderer().setSeriesStroke(3, dotted);*/
// tsce.addSeries(delayupmin);
// tsce.addSeries(delaydownmin);
jfce = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("delaymonitor"),
UIEnv.getRsb().getString("time") + "(s)", UIEnv.getRsb().getString("delay") + "(ms)", tsce);
jfce.getXYPlot().setBackgroundPaint(Color.BLACK);
jfce.getXYPlot().getRenderer().setSeriesPaint(0, Color.RED);
jfce.getXYPlot().getRenderer().setSeriesPaint(1, Color.GREEN);
BasicStroke dotted = new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0,
new float[] { 0, 6, 0, 6 }, 0);
/*
* jfce.getXYPlot().getRenderer().setSeriesPaint(2,Color.RED);
* jfce.getXYPlot().getRenderer().setSeriesStroke(2, dotted);
* jfce.getXYPlot().getRenderer().setSeriesPaint(3,Color.GREEN);
* jfce.getXYPlot().getRenderer().setSeriesStroke(3, dotted);
*/
changeFont(jfce);
delp = new JLabel();
delp.setBorder(new LineBorder(Color.DARK_GRAY));
jp.add(delp);
JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.NORTH);
panel.setLayout(new GridLayout(2, 1, 0, 0));
vaddrs = new JTextField();
vaddrs.setHorizontalAlignment(SwingConstants.CENTER);
vaddrs.setFont(new Font("宋体", Font.PLAIN, 14));
vaddrs.setEditable(false);
panel.add(vaddrs);
vaddrs.setColumns(10);
panel.setLayout(new GridLayout(1, 1, 0, 0));
panel_1 = new JPanel();
panel.add(panel_1);
panel_1.setLayout(new BorderLayout(0, 0));
JSlider windowSlider = new JSlider();
windowSlider.setValue(2);
windowSlider.setMaximum(9);
panel_1.add(windowSlider, BorderLayout.CENTER);
JLabel windowSelect = new JLabel("5s");
windowSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
updateTimeRange(windowSlider,windowSelect);
updateTimeRange(windowSlider, windowSelect);
}
});
updateTimeRange(windowSlider,windowSelect);
updateTimeRange(windowSlider, windowSelect);
panel_1.add(windowSelect, BorderLayout.EAST);
lblNewLabel = new JLabel(UIEnv.getRsb().getString("timerange"));
panel_1.add(lblNewLabel, BorderLayout.WEST);
Dimension dms=new Dimension(140, 20);
/*JButton btnNewButton_2 = new JButton("Pressure test");
btnNewButton_2.setPreferredSize(dms);
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tr.pressureTest();
}
});
panel_1.add(btnNewButton_2);
btnNewButton_2.setForeground(Color.BLUE);*/
Dimension dms = new Dimension(140, 20);
/*
* JButton btnNewButton_2 = new JButton("Pressure test");
* btnNewButton_2.setPreferredSize(dms); btnNewButton_2.addActionListener(new
* ActionListener() { public void actionPerformed(ActionEvent e) {
* tr.pressureTest(); } }); panel_1.add(btnNewButton_2);
* btnNewButton_2.setForeground(Color.BLUE);
*/
addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void windowActivated(WindowEvent e) {
// TODO 自动生成的方法存根
}
});
}
protected void updateTimeRange(JSlider windowSlider,JLabel windowSelect) {
timeRange=values[windowSlider.getValue()];
protected void updateTimeRange(JSlider windowSlider, JLabel windowSelect) {
timeRange = values[windowSlider.getValue()];
synchronized (jfc) {
jfc.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
jfc.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
spdup.setMaximumItemCount((int) timeRange);
spddown.setMaximumItemCount((int) timeRange);
}
synchronized (jfce) {
jfce.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
jfce.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange);
delayup.setMaximumItemCount((int) timeRange);
delaydown.setMaximumItemCount((int) timeRange);
}
windowSelect.setText(timeRange/1000+"s");
windowSelect.setText(timeRange / 1000 + "s");
}
private void changeFont(JFreeChart jfc2) {
jfc2.getTitle().setFont(UIEnv.getFont().deriveFont(16.0f));
jfc2.getLegend().setItemFont(UIEnv.getFont());
@@ -236,152 +239,157 @@ public class LineMonitorGUI extends XFrame{
jfc2.getXYPlot().getDomainAxis().setLabelFont(UIEnv.getFont());
jfc2.getXYPlot().getDomainAxis().setTickLabelFont(UIEnv.getFont());
}
private void recordSpeedData() {
if(isVisible()) {
Millisecond ms= new Millisecond();
if (isVisible()) {
Millisecond ms = new Millisecond(
new Date(tr.getMonitor().getClock().getCurrentTimeMillis()));
synchronized (jfc) {
spdup.addOrUpdate(ms, tr.getMonitor().getOutSpeed()/1024.0);
spddown.addOrUpdate(ms, tr.getMonitor().getInSpeed()/1024.0);
spdup.addOrUpdate(ms, tr.getMonitor().getOutSpeed() / 1024.0);
spddown.addOrUpdate(ms, tr.getMonitor().getInSpeed() / 1024.0);
}
}
}
private void recordDelayData() {
if(isVisible()) {
Millisecond ms= new Millisecond();
if (isVisible()) {
synchronized (jfce) {
delayup.addOrUpdate(ms, (tr.getMonitor().getOutDelay()+tr.getMonitor().getQueueingDelay())/1000000.0);
delaydown.addOrUpdate(ms, tr.getMonitor().getInDelay()/1000000.0);
TimestampMonitorValue valup = tr.getMonitor().getUploadBandwidth().getRecentDelayEntry();
if (valup != null) {
Millisecond ms = new Millisecond(
new Date(valup.getTimestamp().divide(new Long128(1000000L)).longValue()));
//System.out.println(ms+" "+new Millisecond());
delayup.addOrUpdate(ms, valup.getDelay() / 1000000.0);
}
TimestampMonitorValue valdown = tr.getMonitor().getDownloadBandwidth().getRecentDelayEntry();
if (valdown != null) {
Millisecond ms2 = new Millisecond(
new Date(valdown.getTimestamp().divide(new Long128(1000000L)).longValue()));
delaydown.addOrUpdate(ms2, valdown.getDelay() / 1000000.0);
}
}
}
}
@Override
public void setVisible(boolean b) {
if(b) {
if(timer==null) {
timer=new Timer();
timer1=new Timer();
timer2=new Timer();
tsk3= new TimerTask() {
if (b) {
if (timer == null) {
timer = new Timer();
timer1 = new Timer();
timer2 = new Timer();
tsk3 = new TimerTask() {
@Override
public void run() {
updateTraffic();
}
};
tsk4= new TimerTask() {
@Override
public void run() {
recordSpeedData();
}
};
tsk5= new TimerTask() {
@Override
public void run() {
recordDelayData();
}
};
d1= new TimerTask() {
@Override
public void run() {
if(isVisible()) {
synchronized (jfc) {
ImageIcon i1=new ImageIcon(jfc.createBufferedImage(spdp.getWidth(), spdp.getHeight()));
spdp.setIcon(i1);
}
@Override
public void run() {
updateTraffic();
}
}
};
d2= new TimerTask() {
};
tsk4 = new TimerTask() {
@Override
public void run() {
if(isVisible()) {
synchronized (jfce) {
ImageIcon i2=new ImageIcon(jfce.createBufferedImage(delp.getWidth(), delp.getHeight()));
delp.setIcon(i2);
@Override
public void run() {
recordSpeedData();
}
};
tsk5 = new TimerTask() {
@Override
public void run() {
recordDelayData();
}
};
d1 = new TimerTask() {
@Override
public void run() {
if (isVisible()) {
synchronized (jfc) {
ImageIcon i1 = new ImageIcon(
jfc.createBufferedImage(spdp.getWidth(), spdp.getHeight()));
spdp.setIcon(i1);
}
}
}
}
};
timer.scheduleAtFixedRate(tsk3, 25, 25);
timer1.scheduleAtFixedRate(tsk4, 5, 5);
timer1.scheduleAtFixedRate(d1, 25, 25);
timer2.scheduleAtFixedRate(tsk5, 5, 5);
timer2.scheduleAtFixedRate(d2, 25, 25);
}
}else {
if(tsk3!=null)
tsk3.cancel();
if(tsk4!=null)
tsk4.cancel();
if(tsk5!=null)
tsk5.cancel();
if(d1!=null)
d1.cancel();
if(d2!=null)
d2.cancel();
if(timer!=null)
timer.cancel();
if(timer1!=null)
timer1.cancel();
};
d2 = new TimerTask() {
if(timer2!=null)
timer2.cancel();
timer=null;
@Override
public void run() {
if (isVisible()) {
synchronized (jfce) {
ImageIcon i2 = new ImageIcon(
jfce.createBufferedImage(delp.getWidth(), delp.getHeight()));
delp.setIcon(i2);
}
}
}
};
timer.scheduleAtFixedRate(tsk3, 25, 25);
timer1.scheduleAtFixedRate(tsk4, 5, 5);
timer1.scheduleAtFixedRate(d1, 25, 25);
timer2.scheduleAtFixedRate(tsk5, 1, 1);
timer2.scheduleAtFixedRate(d2, 25, 25);
}
} else {
if (tsk3 != null)
tsk3.cancel();
if (tsk4 != null)
tsk4.cancel();
if (tsk5 != null)
tsk5.cancel();
if (d1 != null)
d1.cancel();
if (d2 != null)
d2.cancel();
if (timer != null)
timer.cancel();
if (timer1 != null)
timer1.cancel();
if (timer2 != null)
timer2.cancel();
timer = null;
}
super.setVisible(b);
}
public void updateTraffic() {
switch (tr.getMonitor().getState()) {
case MonitorData.OFFLINE:
getTitlelabel().setForeground(Color.RED);
break;
case MonitorData.CONNECTING:
getTitlelabel().setForeground(Color.YELLOW);
break;
case MonitorData.ONLINE:
getTitlelabel().setForeground(Color.GREEN);
break;
default:
break;
}
if(isVisible()) {
//spddown.fireSeriesChanged();
//delaydown.fireSeriesChanged();
Inet6AddressGroup irg=tr.getRemoteVaddr();
String text;
if(irg==null) {
text="unknown";
}else {
Inet6Address i6a= irg.getAddress();
text=i6a.getHostAddress();
}
if(!vaddrs.getText().equals(text)) {
vaddrs.setText(text);
}
case MonitorData.DOWN:
getTitlelabel().setForeground(Color.RED);
break;
case MonitorData.UNSTABLE:
getTitlelabel().setForeground(Color.YELLOW);
break;
case MonitorData.UP:
getTitlelabel().setForeground(Color.GREEN);
break;
default:
break;
}
if (isVisible()) {
// spddown.fireSeriesChanged();
// delaydown.fireSeriesChanged();
IPv6AddressGroup irg = tr.getRemoteVaddr();
String text;
if (irg == null) {
text = "unknown";
} else {
IPv6Address i6a = irg.getAddress();
text = i6a.toString();
}
}
}
}
@@ -39,6 +39,7 @@ import javax.swing.JPopupMenu;
import javax.swing.border.LineBorder;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.klalb.KLALBController;
import org.kne.cloud.network.klalb.KLALBUtils;
import org.kne.cloud.network.srv6.KLALBRoutingProtocol;
@@ -60,7 +61,7 @@ public class NetworkGraphPanel extends GraphPanel {
private class InetGraphNode extends GraphNode{
private InetAddress address;
private IPv6Address address;
private JPopupMenu popupMenu;
public InetGraphNode() {
@@ -68,7 +69,7 @@ public class NetworkGraphPanel extends GraphPanel {
initign();
}
public InetGraphNode(InetAddress address, Color color, double x, double y, boolean ismarked) {
public InetGraphNode(IPv6Address address, Color color, double x, double y, boolean ismarked) {
super(getText(address), color, x, y, ismarked);
this.address=address;
initign();
@@ -82,7 +83,7 @@ public class NetworkGraphPanel extends GraphPanel {
@Override
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(address.getHostAddress()), null);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(address.toString()), null);
}
});
popupMenu.add(mcpyitm);
@@ -104,8 +105,8 @@ public class NetworkGraphPanel extends GraphPanel {
public void actionPerformed(ActionEvent e) {
KperfGUI kpfg=new KperfGUI();
kpfg.setVisible(true);
MultipurposeSocketAddress source=new MultipurposeSocketAddress("KLALB_Stream",controller.getIpv6Router().getLocator().getAddress().getHostAddress(),0);
MultipurposeSocketAddress target=new MultipurposeSocketAddress("KLALB_Stream", address.getHostAddress(), 4564);
MultipurposeSocketAddress source=new MultipurposeSocketAddress("KLALB_Stream",controller.getIpv6Router().getLocator().getAddress().toString(),0);
MultipurposeSocketAddress target=new MultipurposeSocketAddress("KLALB_Stream", address.toString(), 4564);
kpfg.setTarget(target,source);
}
});
@@ -116,7 +117,7 @@ public class NetworkGraphPanel extends GraphPanel {
@Override
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger())
if(e.getButton()==MouseEvent.BUTTON3)
popupMenu.show(NetworkGraphPanel.this,e.getX(),e.getY());
}
@@ -155,21 +156,15 @@ public class NetworkGraphPanel extends GraphPanel {
private static String getText(InetAddress address2) {
String text;
if(address2 instanceof Inet6Address) {
text=KLALBUtils.parseAbbrIPv6(address2.getHostAddress());
}else {
text=address2.getHostAddress();
}
return text;
private static String getText(IPv6Address address2) {
return address2.toCompressedString();
}
public InetAddress getAddress() {
public IPv6Address getAddress() {
return address;
}
public void setAddress(InetAddress address) {
public void setAddress(IPv6Address address) {
this.address = address;
super.setText(getText(address));
}
@@ -192,18 +187,18 @@ public class NetworkGraphPanel extends GraphPanel {
}
}
protected void loadNodes() {
Map<Inet6Address, Long> addr= controller.getIpv6Router().getKlalbRouteProtol().getAddresses();
Set<Inet6Address> ks=addr.keySet();
for (Iterator<Inet6Address> iterator = ks.iterator(); iterator.hasNext();) {
Inet6Address inet6Address = (Inet6Address) iterator.next();
Map<IPv6Address, Long> addr= controller.getIpv6Router().getKlalbRouteProtol().getAddresses();
Set<IPv6Address> ks=addr.keySet();
for (Iterator<IPv6Address> iterator = ks.iterator(); iterator.hasNext();) {
IPv6Address inet6Address = (IPv6Address) iterator.next();
if(!getNodes().containsKey(inet6Address)) {
Vector2 v2pos=super.getRandomPos();
getNodes().put(inet6Address,new InetGraphNode(inet6Address,Color.BLACK,v2pos.x,v2pos.y,inet6Address.equals(controller.getIpv6Router().getLocator().getAddress())));
}
}
Set<Inet6Address> kns=getNodes().keySet();
for (Iterator<Inet6Address> iterator = kns.iterator(); iterator.hasNext();) {
Inet6Address inet6Address = (Inet6Address) iterator.next();
Set<IPv6Address> kns=getNodes().keySet();
for (Iterator<IPv6Address> iterator = kns.iterator(); iterator.hasNext();) {
IPv6Address inet6Address = (IPv6Address) iterator.next();
if(!addr.containsKey(inet6Address)) {
iterator.remove();
}
@@ -212,10 +207,10 @@ public class NetworkGraphPanel extends GraphPanel {
synchronized (getEdgeGroups()) {
getEdgeGroups().clear();
Map<Inet6Address, List<LinkDirection>> addr1= controller.getIpv6Router().getKlalbRouteProtol().getPaths();
Set<Entry<Inet6Address, List<LinkDirection>>> salink=addr1.entrySet();
for (Iterator<Entry<Inet6Address, List<LinkDirection>>> iterator = salink.iterator(); iterator.hasNext();) {
Entry<Inet6Address, List<LinkDirection>> entry = (Entry<Inet6Address, List<LinkDirection>>) iterator.next();
Map<IPv6Address, List<LinkDirection>> addr1= controller.getIpv6Router().getKlalbRouteProtol().getPaths();
Set<Entry<IPv6Address, List<LinkDirection>>> salink=addr1.entrySet();
for (Iterator<Entry<IPv6Address, List<LinkDirection>>> iterator = salink.iterator(); iterator.hasNext();) {
Entry<IPv6Address, List<LinkDirection>> entry = (Entry<IPv6Address, List<LinkDirection>>) iterator.next();
List<LinkDirection>lps=entry.getValue();
for (Iterator<LinkDirection> iterator2 = lps.iterator(); iterator2.hasNext();) {
LinkDirection linkPath = (LinkDirection) iterator2.next();
@@ -240,15 +235,15 @@ public class NetworkGraphPanel extends GraphPanel {
}
private GraphEdgeGroup getGroup(InetGraphNode a,InetGraphNode b) {
for (Iterator iterator = getEdgeGroups().iterator(); iterator.hasNext();) {
for (Iterator<GraphEdgeGroup> iterator = getEdgeGroups().iterator(); iterator.hasNext();) {
GraphEdgeGroup graphEdgeGroup = (GraphEdgeGroup) iterator.next();
if(graphEdgeGroup.match(a,b)) {
return graphEdgeGroup;
}
}
GraphEdgeGroup ng=new InetGraphEdgeGroup(a, b);
Inet6Address aprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode((Inet6Address) a.getAddress());
Inet6Address bprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode((Inet6Address) b.getAddress());
IPv6Address aprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode( a.getAddress());
IPv6Address bprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode( b.getAddress());
if( b.getAddress().equals(aprev)||a.getAddress().equals(bprev)) {
ng.setShortest(true);
@@ -23,6 +23,7 @@ import javax.swing.event.ListSelectionListener;
import org.kne.cloud.klalb.uitool.XDefaultListModel;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.klalb.KLALBController;
import org.kne.cloud.network.srv6.KLALBRoutingProtocol;
import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIClient;
@@ -37,7 +38,7 @@ import java.awt.event.MouseListener;
import java.awt.event.ActionEvent;
public class NodeInformationPanel extends JPanel {
private InetAddress address;
private IPv6Address address;
private KLALBRoutingProtocolAPIClient client;
private KLALBController controller;
private Image image;
@@ -46,14 +47,14 @@ public class NodeInformationPanel extends JPanel {
public KLALBController getController() {
return controller;
}
public InetAddress getAddress() {
public IPv6Address getAddress() {
return address;
}
public Image getImage() {
return image;
}
public NodeInformationPanel (KLALBController controller,InetAddress address,Image image) {
public NodeInformationPanel (KLALBController controller,IPv6Address address,Image image) {
this.controller=controller;
this.address=address;
this.image=image;
@@ -115,16 +116,14 @@ public class NodeInformationPanel extends JPanel {
@Override
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) {
if(e.getButton()==MouseEvent.BUTTON3) {
jpop.show(list, e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
if(e.isPopupTrigger()) {
jpop.show(list, e.getX(), e.getY());
}
}
@Override
@@ -151,7 +150,7 @@ public class NodeInformationPanel extends JPanel {
client=new KLALBRoutingProtocolAPIClient(controller.getIpv6Router().getKlalbRouteProtol());
try {
client.requestOpenLines(new InetSocketAddress(address, KLALBRoutingProtocol.DEFAULT_PORT), (result)->{
client.requestOpenLines(new InetSocketAddress( address.toInet6Address(), KLALBRoutingProtocol.DEFAULT_PORT), (result)->{
listModel.clear();
for (MultipurposeSocketAddress multipurposeSocketAddress : result) {
listModel.addElement(multipurposeSocketAddress);
@@ -1,131 +0,0 @@
package org.kne.cloud.network.klalb.ui;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.cloud.network.monitor.MonitorData;
import java.awt.Font;
import java.util.Objects;
public class TPanel extends JPanel {
private JLabel tname;
private JLabel targ;
private KLALBRemoteLine tunnel;
@Override
public int hashCode() {
return Objects.hash(tunnel);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TPanel other = (TPanel) obj;
return Objects.equals(tunnel, other.tunnel);
}
public JLabel getTname() {
return tname;
}
public JLabel getTarg() {
return targ;
}
/**
* @wbp.parser.constructor
*/
public TPanel(KLALBRemoteLine t) {
this.tunnel = t;
setOpaque(false);
setLayout(new BorderLayout(0, 0));
tname = new JLabel();
tname.setText(t.getMonitor().getName());
tname.setFont(new Font("宋体", Font.BOLD, 16));
add(tname, BorderLayout.WEST);
targ = new JLabel();
targ.setFont(new Font("宋体", Font.PLAIN, 13));
targ.setHorizontalAlignment(SwingConstants.TRAILING);
targ.setForeground(Color.YELLOW);
add(targ, BorderLayout.CENTER);
setBorder(new LineBorder(Color.BLACK));
setSize(650, 25);
setPreferredSize(getSize());
}
private volatile long up, down, ups, downs;
private volatile long delay=Long.MAX_VALUE;
public long getDelay() {
return delay;
}
private void updateText() {
String dl;
if (delay == Long.MIN_VALUE)
dl = "??";
else
dl = Long.toString(delay / 1000000L);
targ.setText(bytesUnit(up) + "\u2191 " + bytesUnit(down) + "\u2193 " + bytesUnit(ups) + "/s\u2191 "
+ bytesUnit(downs) + "/s\u2193 " + dl + "ms");
}
public KLALBRemoteLine getTunnel() {
return tunnel;
}
private String bytesUnit(long v) {
if (v >= 1024L * 1024 * 1024 * 1024 * 1024) {
return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)) + "PB";
} else if (v >= 1024L * 1024 * 1024 * 1024) {
return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0)) + "TB";
} else if (v >= 1024L * 1024 * 1024) {
return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0)) + "GB";
} else if (v >= 1024L * 1024) {
return String.format("%.1f", v / (1024.0 * 1024.0)) + "MB";
} else if (v >= 1024L) {
return String.format("%.1f", v / (1024.0)) + "KB";
} else {
return v + "B";
}
}
public void updateTraffic() {
switch (tunnel.getMonitor().getState()) {
case MonitorData.OFFLINE:
tname.setForeground(Color.RED);
break;
case MonitorData.CONNECTING:
tname.setForeground(Color.YELLOW);
break;
case MonitorData.ONLINE:
tname.setForeground(Color.GREEN);
break;
default:
break;
}
up = tunnel.getMonitor().getOutTraffic();
down = tunnel.getMonitor().getInTraffic();
this.ups = tunnel.getMonitor().getOutSpeed();
this.downs = tunnel.getMonitor().getInSpeed();
this.delay = tunnel.getMonitor().getLatency();
//System.out.println(delay);
updateText();
}
}
+30 -21
View File
@@ -3,6 +3,7 @@ package org.kne.cloud.network.klalb.ui;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
@@ -10,6 +11,8 @@ import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ipv6.IPv6Address;
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
import org.kne.cloud.network.klalb.CONST;
import org.kne.cloud.network.klalb.KLALBController;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
@@ -80,7 +83,7 @@ public class TPanel2 extends JPanel {
tname = new JLabel();
tname.setText(t.getMonitor().getName());
tname.setFont(new Font("宋体", Font.BOLD, 16));
tname.setFont(new Font("宋体", Font.BOLD, 14));
targup = new JLabel();
try {
@@ -134,10 +137,13 @@ public class TPanel2 extends JPanel {
panel_2.setLayout(null);
lblNewLabel = new JLabel();
lblNewLabel.setBounds(0, 0, 50, 45);
lblNewLabel.setBounds(0, 0, 50, 40);
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setVerticalAlignment(SwingConstants.CENTER);
panel_2.add(lblNewLabel);
try {
lblNewLabel.setIcon(new ImageIcon(getImgEth()));
double scalex=1.0;
lblNewLabel.setIcon(new ImageIcon(getImgEth().getScaledInstance((int)(getImgEth().getWidth(null)*scalex), (int)(getImgEth().getHeight(null)*scalex), Image.SCALE_FAST)));
} catch (IOException e1) {
e1.printStackTrace();
}
@@ -145,13 +151,13 @@ public class TPanel2 extends JPanel {
lblNewLabel_1 = new JLabel();
lblNewLabel_1.setOpaque(true);
lblNewLabel_1.setBackground(Color.LIGHT_GRAY);
lblNewLabel_1.setBounds(6, 9, 7, 4);
lblNewLabel_1.setBounds(8, 7, 7, 4);
panel_2.add(lblNewLabel_1);
lblNewLabel_2 = new JLabel();
lblNewLabel_2.setOpaque(true);
lblNewLabel_2.setBackground(Color.LIGHT_GRAY);
lblNewLabel_2.setBounds(35, 9, 7, 4);
lblNewLabel_2.setBounds(37, 7, 7, 4);
panel_2.add(lblNewLabel_2);
@@ -234,7 +240,7 @@ public class TPanel2 extends JPanel {
@Override
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger())
if(e.getButton()==MouseEvent.BUTTON3)
popupMenu.show(TPanel2.this,e.getX(),e.getY());
}
@@ -305,8 +311,8 @@ public class TPanel2 extends JPanel {
private void updateText() {
targup.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getOutTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getOutSpeedAvg()) + "/s "+ KLALBUtils.convertUintNanoDefalut(tunnel.getMonitor().getOutDelay()) + "s");
targdown.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getInTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getInSpeedAvg()) + "/s " + KLALBUtils.convertUintNanoDefalut( tunnel.getMonitor().getInDelay()) + "s");
targup.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getOutTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getOutSpeed()) + "/s "+ KLALBUtils.convertUintNanoDefalut(tunnel.getMonitor().getOutDelay()) + "s");
targdown.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getInTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getInSpeed()) + "/s " + KLALBUtils.convertUintNanoDefalut( tunnel.getMonitor().getInDelay()) + "s");
if(tunnel.getMonitor().getOutSpeed()>4096||tunnel.getMonitor().getInSpeed()>4096) {
lblNewLabel_2.setBackground(Color.ORANGE);
@@ -322,32 +328,35 @@ public class TPanel2 extends JPanel {
public void updateTraffic() {
switch (tunnel.getMonitor().getState()) {
case MonitorData.OFFLINE:
case MonitorData.DOWN:
tname.setForeground(Color.RED);
lblNewLabel_1.setBackground(Color.LIGHT_GRAY);
break;
case MonitorData.CONNECTING:
case MonitorData.UNSTABLE:
tname.setForeground(Color.YELLOW);
lblNewLabel_1.setBackground(Color.LIGHT_GRAY);
break;
case MonitorData.ONLINE:
case MonitorData.UP:
tname.setForeground(Color.GREEN);
lblNewLabel_1.setBackground(Color.GREEN);
Inet6Address unvar=tunnel.getRemoteVaddr().getAddress();
if(unvar==null) {
this.vaddr.setText("unknown");
}else {
this.vaddr.setText(unvar.getHostAddress());
}
updateText();
break;
default:
break;
}
if(tunnel.getMonitor().getState()!=MonitorData.DOWN) {
IPv6AddressGroup unvar=tunnel.getRemoteVaddr();
if(unvar==null) {
this.vaddr.setText("unknown");
}else {
this.vaddr.setText(unvar.getAddress().toString());
}
updateText();
}
//mdg.updateTraffic();
}