forked from KNEMC/KLALB
KLALB2.3
This commit is contained in:
@@ -6,42 +6,36 @@ import java.io.ByteArrayInputStream;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PushbackInputStream;
|
||||
|
||||
import org.kne.cloud.network.klalb.PINGPacket;
|
||||
import org.kne.io.VarDataInputStream;
|
||||
|
||||
public class MinecraftInputStream extends VarDataInputStream {
|
||||
public class MinecraftInputStream extends VarDataInputStream{
|
||||
private MinecraftProtocolContext context;
|
||||
private PushbackInputStream in;
|
||||
private VarDataInputStream vdi;
|
||||
public MinecraftInputStream(InputStream in,MinecraftProtocolContext context) {
|
||||
super(grin(in));
|
||||
super(in);
|
||||
this.in=new PushbackInputStream(in);
|
||||
this.vdi=new VarDataInputStream(this.in);
|
||||
this.context=context;
|
||||
}
|
||||
private static InputStream grin(InputStream in) {
|
||||
InputStream rin;
|
||||
if(in.markSupported()) {
|
||||
rin=in;
|
||||
}else {
|
||||
rin=new BufferedInputStream(in,8192);
|
||||
}
|
||||
return rin;
|
||||
}
|
||||
public MinecraftProtocolContext getContext() {
|
||||
return context;
|
||||
}
|
||||
public MinecraftPacket readPacket() throws IOException {
|
||||
mark(1);
|
||||
read();
|
||||
reset();
|
||||
in.unread(in.read());
|
||||
if(context.getState()==2) {
|
||||
MinecraftUnsolvedPacket mup=new MinecraftUnsolvedPacket();
|
||||
mup.readFromStream(this);
|
||||
mup.readFromStream(vdi);
|
||||
if(mup.getLenth()==-1) {
|
||||
return null;
|
||||
}else {
|
||||
return mup;
|
||||
}
|
||||
}
|
||||
byte[]b=readPacketVarBytes();
|
||||
byte[]b=vdi.readPacketVarBytes();
|
||||
if(b==null)
|
||||
return null;
|
||||
VarDataInputStream vdi=new VarDataInputStream(new ByteArrayInputStream(b));
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
package org.kne.cloud.network.minecraft;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.scanner.InetAddressRange;
|
||||
import org.kne.cloud.network.scanner.PortRange;
|
||||
import org.kne.cloud.network.scanner.TCPNetworkScanner;
|
||||
|
||||
public class MinecraftScanner extends TCPNetworkScanner{
|
||||
private BiConsumer<MultipurposeSocketAddress, MinecraftServerPinger>minecraftConsumer;
|
||||
|
||||
public BiConsumer<MultipurposeSocketAddress, MinecraftServerPinger> getMinecraftConsumer() {
|
||||
return minecraftConsumer;
|
||||
}
|
||||
|
||||
public void setMinecraftConsumer(BiConsumer<MultipurposeSocketAddress, MinecraftServerPinger> minecraftConsumer) {
|
||||
this.minecraftConsumer = minecraftConsumer;
|
||||
}
|
||||
public MinecraftScanner() {
|
||||
super.setConsumer((mpsa,s)->{
|
||||
if(s!=null) {
|
||||
try {
|
||||
MinecraftServerPinger msp=new MinecraftServerPinger(mpsa,s);
|
||||
if(minecraftConsumer!=null) {
|
||||
minecraftConsumer.accept(mpsa, msp);
|
||||
}
|
||||
} catch (UnknownHostException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}else {
|
||||
if(minecraftConsumer!=null) {
|
||||
minecraftConsumer.accept(mpsa, null);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public MinecraftScanner(int connectTimeout, int soTimeout) {
|
||||
super(connectTimeout, soTimeout);
|
||||
super.setConsumer((mpsa,s)->{
|
||||
if(s!=null) {
|
||||
try {
|
||||
MinecraftServerPinger msp=new MinecraftServerPinger(mpsa,s);
|
||||
if(minecraftConsumer!=null) {
|
||||
minecraftConsumer.accept(mpsa, msp);
|
||||
}
|
||||
} catch (UnknownHostException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}else {
|
||||
if(minecraftConsumer!=null) {
|
||||
minecraftConsumer.accept(mpsa, null);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws UnknownHostException {
|
||||
MinecraftScanner tcn = new MinecraftScanner();
|
||||
tcn.getPortRanges().add(new PortRange(25565));
|
||||
tcn.getPortRanges().add(new PortRange(34000, 37000));
|
||||
tcn.getAddressRanges().add(new InetAddressRange("192.168.0.1","192.168.0.255"));
|
||||
tcn.setMinecraftConsumer((mpsa,mc)->{
|
||||
System.out.println(mc);
|
||||
});
|
||||
tcn.setProcessConsumer((f)->{//System.out.println(f);
|
||||
});
|
||||
|
||||
tcn.run();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringReader;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
@@ -23,9 +24,13 @@ import com.google.gson.JsonParser;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonToken;
|
||||
|
||||
public class MinecraftServerPinger {
|
||||
private Socket socket;
|
||||
private MinecraftProtocolContext mpc=new MinecraftProtocolContext();
|
||||
public class MinecraftServerPinger implements Serializable{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
private transient Socket socket;
|
||||
private transient MinecraftProtocolContext mpc=new MinecraftProtocolContext();
|
||||
private MultipurposeSocketAddress targetaddr;
|
||||
|
||||
|
||||
@@ -44,13 +49,17 @@ public class MinecraftServerPinger {
|
||||
private int klalbvport;
|
||||
|
||||
public MinecraftServerPinger(MultipurposeSocketAddress target) throws UnknownHostException, IOException {
|
||||
this(target,target.connectSocket());
|
||||
}
|
||||
|
||||
public MinecraftServerPinger(MultipurposeSocketAddress target, Socket Asocket) throws UnknownHostException, IOException{
|
||||
targetaddr=target;
|
||||
socket=target.connectSocket();
|
||||
socket=Asocket;
|
||||
socket.setTcpNoDelay(true);
|
||||
ping();
|
||||
analyseJson();
|
||||
}
|
||||
|
||||
|
||||
private void ping() throws IOException {
|
||||
MinecraftInputStream in=null;
|
||||
MinecraftOutputStream out=null;
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
package org.kne.cloud.network.minecraft;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.kne.cloud.network.HostPortMap;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.SocketToSocketProxy;
|
||||
|
||||
public class MinecraftSocketToSocketProxy extends SocketToSocketProxy {
|
||||
private List<Function<MinecraftPacket,MinecraftPacket>> transformersAB=new ArrayList<Function<MinecraftPacket,MinecraftPacket>>();
|
||||
private List<Function<MinecraftPacket,MinecraftPacket>> transformersBA=new ArrayList<Function<MinecraftPacket,MinecraftPacket>>();
|
||||
public List<Function<MinecraftPacket, MinecraftPacket>> getTransformersAB() {
|
||||
return transformersAB;
|
||||
}
|
||||
|
||||
public List<Function<MinecraftPacket, MinecraftPacket>> getTransformersBA() {
|
||||
return transformersBA;
|
||||
}
|
||||
|
||||
public MinecraftSocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind,
|
||||
MultipurposeSocketAddress defaultConnect, Map<String, MultipurposeSocketAddress> detectedConnect)
|
||||
throws IOException {
|
||||
super(listen, cbind, defaultConnect, detectedConnect);
|
||||
}
|
||||
|
||||
public MinecraftSocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress cbind,
|
||||
MultipurposeSocketAddress defaultConnect) throws IOException {
|
||||
super(listen, cbind, defaultConnect);
|
||||
}
|
||||
|
||||
public MinecraftSocketToSocketProxy(MultipurposeSocketAddress listen, MultipurposeSocketAddress connect)
|
||||
throws IOException {
|
||||
super(listen, connect);
|
||||
}
|
||||
|
||||
public MinecraftSocketToSocketProxy(String l, String r) throws IOException {
|
||||
super(l, r);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void runBridge(Socket sk, Socket sox) throws IOException {//new KLALBJsonMotdInserter(()->{return kc.getSelf();},()->{return 23333;})
|
||||
MinecraftSocketBridge dsb=new MinecraftSocketBridge(sk,sox);
|
||||
dsb.getBridgeAB().getTransformers().addAll(transformersAB);
|
||||
dsb.getBridgeBA().getTransformers().addAll(transformersBA);
|
||||
dsb.run();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,6 +30,7 @@ public class MinecraftStreamBridge extends StreamBridge {
|
||||
}
|
||||
mout.writePacket(mp);
|
||||
mout.flush();
|
||||
Thread.yield();
|
||||
//System.out.println(mp);
|
||||
}
|
||||
//super.runTask();
|
||||
|
||||
@@ -18,9 +18,11 @@ import org.kne.cloud.network.SocketToSocketProxy;
|
||||
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.KLALBStateGUI2;
|
||||
import org.kne.util.AutoProperties;
|
||||
|
||||
public class SimpleKLALBMinecraftClient {
|
||||
public static KLALBStateGUI2 ksg;
|
||||
public static void main(String[] args) throws UnknownHostException, IOException {
|
||||
|
||||
System.out.println(CONST.klalb+" V"+CONST.klalbver);
|
||||
@@ -46,20 +48,41 @@ public static void main(String[] args) throws UnknownHostException, IOException
|
||||
MultipurposeSocketAddress vmsa=new MultipurposeSocketAddress("KLALB_Stream",new InetSocketAddress(vad, msp.getKlalbvport()));
|
||||
System.out.println("连接成功:"+ap.getProperty("server"));
|
||||
new SocketToSocketProxy(new MultipurposeSocketAddress(ap.getProperty("local")), vmsa);
|
||||
System.out.println("提示:输入state并回车可以查看当前线路状态");
|
||||
//System.out.println("提示:输入state并回车可以查看当前线路状态");
|
||||
while(true) {
|
||||
String s=scn.nextLine();
|
||||
switch(s) {
|
||||
case "help":
|
||||
System.out.print("help:查看命令使用说明");
|
||||
System.out.print("state:查看线路状态");
|
||||
//System.out.println("reload:重新加载线路配置文件");
|
||||
System.out.println("reconnect:所有离线线路跳过重连等待时间立即尝试重连");
|
||||
System.out.println("monitor:显示监视器图形界面");
|
||||
System.out.println("stop:退出程序");
|
||||
break;
|
||||
case "stop":
|
||||
System.exit(0);
|
||||
break;
|
||||
case "state":
|
||||
System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t延迟\t抖动\t下一次重试");
|
||||
System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动");
|
||||
synchronized (kc.getLines()) {
|
||||
for (Iterator<KLALBRemoteLine> iterator = kc.getLines().iterator(); iterator.hasNext();) {
|
||||
KLALBRemoteLine hostPort = iterator.next();
|
||||
System.out.println(hostPort .toString2());
|
||||
System.out.println(hostPort .toString());
|
||||
//System.out.println();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "monitor":
|
||||
if(ksg==null)
|
||||
ksg=new KLALBStateGUI2(kc);
|
||||
ksg.setVisible(true);
|
||||
break;
|
||||
case "reconnect":
|
||||
kc.reconnectImmediately();
|
||||
break;
|
||||
default :
|
||||
System.out.println("未知命令!");
|
||||
System.out.println("未知命令,请输入help以查询命令说明");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,9 +35,9 @@ public class SimpleKLALBMinecraftServer {
|
||||
|
||||
System.out.println("虚拟地址:"+sp.getVirtualIP().getHostAddress());
|
||||
kc=new KLALBController(sp.getVirtualIP());
|
||||
kc.setSelflineTableSupplier(()->{
|
||||
/*kc.setSelflineTableSupplier(()->{
|
||||
return fileRead("linetable.txt");
|
||||
});
|
||||
});*/
|
||||
kc.registerToProxyTypeAs("KLALB");
|
||||
|
||||
System.out.println("开放端口:"+sp.getBind());
|
||||
@@ -57,10 +57,10 @@ public class SimpleKLALBMinecraftServer {
|
||||
System.out.println("reload:重新加载线路配置");
|
||||
break;
|
||||
case "state":
|
||||
System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t延迟\t抖动\t下一次重试");
|
||||
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 .toString2());
|
||||
System.out.println(hostPort .toString());
|
||||
//System.out.println();
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user