195 lines
6.7 KiB
Java
195 lines
6.7 KiB
Java
package org.kne.cloud.network.minecraft;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.File;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.net.Socket;
|
|
import java.net.UnknownHostException;
|
|
import java.util.Iterator;
|
|
import java.util.Scanner;
|
|
|
|
import org.kne.cloud.network.MultipurposeSocketAddress;
|
|
import org.kne.cloud.network.ProtocolDetectorServerSocketFactory;
|
|
import org.kne.cloud.network.ProtocolDetectorSocket;
|
|
import org.kne.cloud.network.SocketListener;
|
|
import org.kne.cloud.network.SocketType;
|
|
import org.kne.cloud.network.klalb.CONST;
|
|
import org.kne.cloud.network.klalb.KLALBController;
|
|
import org.kne.cloud.network.klalb.KLALBRemoteLine;
|
|
import org.kne.cloud.network.klalb.KLALBVirtualSocket;
|
|
import org.kne.cloud.network.klalb.ServerPropties;
|
|
import org.kne.cloud.network.klalb.StreamKLALBPacketLink;
|
|
|
|
public class SimpleKLALBMinecraftServer {
|
|
public static SocketListener tcpl,tcpl2;
|
|
public static ServerPropties sp;
|
|
public static KLALBController kc;
|
|
static {
|
|
MultipurposeSocketAddress.getSocketTypeRegister().put("DETTCP",new SocketType(null, new ProtocolDetectorServerSocketFactory()));
|
|
}
|
|
public static void main(String[] args) throws IOException {
|
|
|
|
System.out.println(CONST.klalb+"[Minecraft版] V"+CONST.klalbver);
|
|
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":
|
|
System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
|
|
for (Iterator<KLALBRemoteLine> iterator = kc.getLines().iterator(); iterator.hasNext();) {
|
|
KLALBRemoteLine hostPort = iterator.next();
|
|
System.out.println(hostPort .toString());
|
|
//System.out.println();
|
|
}
|
|
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 SocketListener(mpsa);
|
|
tcpl.setCon((soc)->{
|
|
ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc;
|
|
if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) {
|
|
KLALBRemoteLine krs=null;
|
|
try {
|
|
krs = new KLALBRemoteLine(new StreamKLALBPacketLink(pds));
|
|
kc.addRemoteLine(krs);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}else {
|
|
MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(sp.getLocal());
|
|
Socket s=null;
|
|
try {
|
|
s=mpsa2.connectSocket();
|
|
MinecraftSocketBridge dsb=new MinecraftSocketBridge(pds, s);
|
|
dsb.getBridgeBA().getTransformers().add(new KLALBJsonMotdInserter(()->{return kc.getSelf();},()->{return 23333;}));
|
|
dsb.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();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
private static void openLocalPort(String bip) throws IOException {
|
|
if(tcpl2!=null)
|
|
tcpl2.close();
|
|
MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip);
|
|
tcpl2=new SocketListener(new MultipurposeSocketAddress("KLALB_Stream", "::0", 23333));
|
|
tcpl2.setCon((soc)->{
|
|
Socket s=null;
|
|
try {
|
|
s=mpsa.connectSocket();
|
|
s.setTcpNoDelay(true);
|
|
//soc.setTcpNoDelay(true);
|
|
//((KLALBVirtualSocket) soc).setCompress(1);
|
|
MinecraftSocketBridge dsb=new MinecraftSocketBridge(soc, s);
|
|
dsb.getBridgeBA().getTransformers().add(new KLALBJsonMotdInserter(()->{return kc.getSelf();},()->{return 23333;}));
|
|
//dsb.getSab().setDelay(1);
|
|
dsb.run();
|
|
/*CompressedSocketBridge csb=new CompressedSocketBridge(s, soc);
|
|
csb.getSab().setDelay(1);
|
|
csb.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();
|
|
}
|
|
}
|
|
|
|
});
|
|
}
|
|
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;
|
|
}
|
|
|
|
}
|