This commit is contained in:
Administrator
2024-08-18 17:47:11 +08:00
parent e4f4c77c19
commit e243203535
121 changed files with 7499 additions and 2169 deletions
@@ -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;