forked from KNEMC/KLALB
181 lines
5.9 KiB
Java
181 lines
5.9 KiB
Java
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<java.util.Map.Entry<MultipurposeSocketAddress, LineEntry>> iterator = le.entrySet().iterator(); iterator.hasNext();) {
|
|
java.util.Map.Entry<MultipurposeSocketAddress, LineEntry> 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;
|
|
}
|
|
|
|
}
|