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 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]); Listaddl=kpcje.getKlalbController().addRemoteLines(mpsa); if(addl.isEmpty()) { System.out.println("添加失败,线路已存在!"); }else { for (Iterator 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]); Listrmvl=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 lri=new ArrayList<>( kpcje.getKlalbController().getIpv6Router().getCurrentRouteTabel()); Collections.sort(lri); System.out.println("路由表:"); System.out.println("前缀\t协议\t优先级\t开销\t标志\t下一跳\t接口"); for (Iterator 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(); } }