package org.kne.cloud.network.klalb; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Iterator; import java.util.List; import java.util.Scanner; import org.kne.cloud.network.klalb.LineManager.LineEntry; import org.kne.cloud.network.mport.MultipurposeSocketAddress; import org.kne.cloud.network.mport.Protocol; import org.kne.cloud.network.mport.ProtocolDetectorServerSocketFactory; import org.kne.cloud.network.mport.ProtocolDetectorSocket; import org.kne.cloud.network.mport.ProxyProfileAnalyser; import org.kne.cloud.network.mport.ProxyProfileExecutor; import org.kne.cloud.network.mport.SocketBridge; import org.kne.cloud.network.mport.TCPListener; public class SimpleKLALBServer { public static TCPListener tcpl,tcpl2; public static ServerPropties sp; public static KLALBController kc; static { MultipurposeSocketAddress.getServerSocketFactoryRegister().put("DETTCP", new ProtocolDetectorServerSocketFactory()); } public static void main(String[] args) throws IOException { System.out.println("KLALB负载均衡V2.0"); sp=new ServerPropties(); System.out.println("虚拟地址:"+sp.getVirtualIP().getHostAddress()); kc=new KLALBController(sp.getVirtualIP()); kc.setSelflineTableSupplier(()->{ return fileRead("linetable.txt"); }); kc.registerToProxyTypeAs("KLALB"); System.out.println("开放端口:"+sp.getBind()); openPort(sp.getBind()); System.out.println("本地服务:"+sp.getLocal()); openLocalPort(sp.getLocal()); Scanner scn=new Scanner(System.in); while(true) { String s=scn.next(); String[]sc=s.split(" "); switch(sc[0]) { case "help": System.out.print("state:查看线路状态"); System.out.println("reload:重新加载线路配置"); break; case "state": LineManager le=kc.getLineManager(); for (Iterator> iterator = le.entrySet().iterator(); iterator.hasNext();) { java.util.Map.Entry hostPort = iterator.next(); System.out.println(hostPort.getValue() .toString()); } break; default: System.out.println("未知命令,请输入help以查询指令说明"); } } } private static void openPort(String bip) throws IOException { if(tcpl!=null) tcpl.close(); MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip,"DETTCP"); tcpl=new TCPListener(mpsa); tcpl.setCon((soc)->{ ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc; if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) { KLALBRemoteSocket krs=new KLALBRemoteSocket(pds); kc.addRemoteSocket(krs); }else { MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(sp.getLocal()); Socket s=null; try { s=mpsa2.connectSocket(); new SocketBridge(pds, s).run(); } catch (UnknownHostException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally { if(s!=null) try { s.close(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } try { soc.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }); tcpl.open(); } private static void openLocalPort(String bip) throws IOException { if(tcpl2!=null) tcpl2.close(); MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip); tcpl2=new TCPListener(new MultipurposeSocketAddress("KLALB", "::0", 23333)); tcpl2.setCon((soc)->{ Socket s=null; try { s=mpsa.connectSocket(); new SocketBridge(soc, s).run(); } catch (UnknownHostException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally { if(s!=null) try { s.close(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } try { soc.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }); tcpl2.open(); } private static String fileRead(String filePath){ //1.定义一个BufferedReader对象,将文件内容读取到缓存 BufferedReader bufferedReader =null; String returnInfo=""; try{ // 2.定义一个file对象 File file = new File(filePath);//定义一个file对象,用来初始化FileReader // 3.定义一个fileReader对象 FileReader reader = new FileReader(file); // 4.定义一个BufferedReader对象,将文件内容读取到缓存 bufferedReader = new BufferedReader(reader); // 5.定义一个字符串缓存,将字符串存放缓存中 StringBuilder stringBuilder = new StringBuilder(); String str = ""; while ((str =bufferedReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格 stringBuilder.append(str + "\n");//将读取的字符串添加换行符后累加存放在缓存中 } returnInfo = stringBuilder.toString(); }catch (Exception e){ e.printStackTrace(); }finally { try{ if(bufferedReader!=null){ bufferedReader.close(); } }catch (Exception e){ e.printStackTrace(); } } return returnInfo; } }