231 lines
7.8 KiB
Java
231 lines
7.8 KiB
Java
package org.kne.cloud.network.klalb;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.net.InetSocketAddress;
|
|
import java.nio.channels.ServerSocketChannel;
|
|
import java.nio.channels.SocketChannel;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.NoSuchElementException;
|
|
import java.util.Scanner;
|
|
|
|
import javax.swing.JFrame;
|
|
|
|
import org.kne.cloud.network.MultipurposeSocketAddress;
|
|
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;
|
|
|
|
public class KLALBMain {
|
|
public static KLALBStateGUI3 ksg;
|
|
public static void main(String[] args) throws IOException {
|
|
try {
|
|
UIEnv.inituie();
|
|
}catch(Exception e) {
|
|
|
|
}
|
|
System.out.println(CONST.klalb+" V"+CONST.klalbver);
|
|
Scanner scn=new Scanner(System.in);
|
|
TimeDebugger dtb=new TimeDebugger();
|
|
dtb.putTime("Start");
|
|
File configJson=new File("klalb-config.json");
|
|
|
|
KLALBProxySystem kpcje=new KLALBProxySystem();
|
|
dtb.putTime("Create");
|
|
kpcje.loadConfigJson(configJson);
|
|
dtb.putTime("Load");
|
|
System.out.println("SRv6地址:"+kpcje.getKlalbController().getSelf().getAddress().getHostAddress());
|
|
try {
|
|
if(!kpcje.getControllerConfig().isNogui())
|
|
openGUI(kpcje);
|
|
}catch(Throwable e) {
|
|
e.printStackTrace();
|
|
}
|
|
dtb.putTime("UI");
|
|
//dtb.print();
|
|
/*MultipurposeSocketAddress mpa=new MultipurposeSocketAddress("127.9.9.9", 49573);
|
|
kpcje.enableRemoteManagement(mpa);
|
|
System.out.println("远程管理端口已在"+mpa+"端口上开启");*/
|
|
/*if(true)
|
|
return;*/
|
|
ServerSocketChannel kpsvr=KLALBVirtualServerSocketChannel.open(kpcje.getKlalbController());
|
|
kpsvr.bind(new InetSocketAddress("::0", 4564));
|
|
SocketChannelListener stlr=new SocketChannelListener(kpsvr);
|
|
stlr.setCon((scl)->{
|
|
try {
|
|
new Kperf(new StreamChannelKLALBPacketLink(scl,false)).startPerfing();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
});
|
|
while(true) {
|
|
try {
|
|
String s=scn.nextLine();
|
|
String[]sc=s.trim().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:退出程序");
|
|
break;
|
|
|
|
case "monitor":
|
|
try {
|
|
openGUI(kpcje);
|
|
}catch(Throwable e) {
|
|
e.printStackTrace();
|
|
}
|
|
break;
|
|
case "lines-state":
|
|
System.out.println("线路状态:");
|
|
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();) {
|
|
IPv6NetworkLink link=iterator.next();
|
|
if(link instanceof KLALBRemoteLine) {
|
|
KLALBRemoteLine hostPort = (KLALBRemoteLine) link;
|
|
System.out.println(hostPort .toString());
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case "lines-add":
|
|
if(sc.length>=2) {
|
|
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
|
|
List<KLALBRemoteLine>addl=kpcje.getKlalbController().addRemoteLines(mpsa);
|
|
if(addl.isEmpty()) {
|
|
System.out.println("添加失败,线路已存在!");
|
|
}else {
|
|
for (Iterator<KLALBRemoteLine> iterator = addl.iterator(); iterator.hasNext();) {
|
|
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
|
|
|
|
System.out.println("添加成功:"+klalbRemoteLine.getMonitor().getName());
|
|
}
|
|
}
|
|
}else {
|
|
System.out.println("请输入要添加地址:端口!");
|
|
}
|
|
break;
|
|
case "lines-remove":
|
|
if(sc.length>=2) {
|
|
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
|
|
List<KLALBRemoteLine>rmvl=kpcje.getKlalbController().removeRemoteLines(mpsa);
|
|
if(rmvl.isEmpty()) {
|
|
System.out.println("未找到匹配移除项");
|
|
}else {
|
|
for (Iterator iterator = rmvl.iterator(); iterator.hasNext();) {
|
|
KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next();
|
|
|
|
System.out.println("移除成功:"+klalbRemoteLine.getMonitor().getName());
|
|
}
|
|
}
|
|
}else {
|
|
System.out.println("请输入要添加地址:端口!");
|
|
}
|
|
break;
|
|
case "stop":
|
|
System.out.println("已退出程序");
|
|
System.exit(0);
|
|
break;
|
|
case "lines-reconnect":
|
|
System.out.println("尝试重连断开的线路");
|
|
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接口");
|
|
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());
|
|
}
|
|
|
|
break;
|
|
case "kperf":
|
|
if(sc.length>=2) {
|
|
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(sc[1]);
|
|
Kperf kp=new Kperf(mpsa);
|
|
kp.startPerfing();
|
|
}else {
|
|
System.out.println("请输入测速服务端地址:端口!");
|
|
}
|
|
|
|
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);
|
|
}
|
|
break;
|
|
//case "$$SYSTEM:":
|
|
//System.out.println();
|
|
//break;
|
|
case "nodebenchmark":
|
|
int nodenumber=100;
|
|
if(sc.length>=2) {
|
|
nodenumber=Integer.parseInt(sc[1]);
|
|
}
|
|
NodeBenchmark nbc=new NodeBenchmark(kpcje.getKlalbController(),nodenumber);
|
|
nbc.startPerfing();
|
|
break;
|
|
default:
|
|
System.out.println("未知命令,请输入help以查询命令说明");
|
|
}
|
|
}catch (NoSuchElementException err) {
|
|
System.out.println("已退出程序");
|
|
System.exit(0);
|
|
}catch(RuntimeException e) {
|
|
System.out.println("错误!");
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
}
|
|
private static void openGUI(KLALBProxySystem kpcje) throws RuntimeException{
|
|
Thread t=new Thread(()->{
|
|
if(ksg==null) {
|
|
ksg=kpcje.getKLALBGUI();
|
|
}
|
|
ksg.setVisible(true);
|
|
});
|
|
t.start();
|
|
}
|
|
|
|
}
|