This commit is contained in:
Administrator
2025-08-08 17:13:27 +08:00
parent 7267aec1fd
commit 306bfd36f7
39 changed files with 2515 additions and 355 deletions
@@ -0,0 +1,112 @@
package org.kne.cloud.network.klalb;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.channels.MulticastChannel;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.kne.cloud.network.DefaultMinecraftSocketBridgeFactory;
import org.kne.cloud.network.DefaultSocketBridgeFactory;
import org.kne.cloud.network.HostPortMap;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.Proxy;
import org.kne.cloud.network.SocketBridgeFactory;
import org.kne.cloud.network.SocketToSocketProxy;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
public class SocketBridgeConfigItem extends KLALBConfigItem {
private MultipurposeSocketAddress Listen;
private LinkedHashMap<String, String>Bridge=new LinkedHashMap<>();
private HostPortMap Connect=new HostPortMap();
public SocketBridgeConfigItem( MultipurposeSocketAddress listen,
LinkedHashMap<String, String> bridge, HostPortMap connect) {
super("SocketBridge");
Listen = listen;
Bridge = bridge;
Connect = connect;
}
@Override
public String toString() {
return "SocketBridgeConfigItem [Listen=" + Listen + ", Bridge=" + Bridge + ", Connect=" + Connect + "]";
}
/*public static JsonDeserializer<SocketBridgeConfigItem> getSocketBridgeConfigItemJsonDeserializer(){
return new JsonDeserializer<SocketBridgeConfigItem>() {
@Override
public SocketBridgeConfigItem deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2)
throws JsonParseException {
if(arg0.isJsonObject()) {
HostPortMap mapp=new HostPortMap();
LinkedHashMap<String, SocketBridgeFactory>mapb=new LinkedHashMap<>();
MultipurposeSocketAddress l=new MultipurposeSocketAddress(((JsonObject) arg0).get("Listen").getAsString());
SocketBridgeFactory bdg=getDefaultBridgeFactory(((JsonObject)arg0).get("Bridge"),mapb);
MultipurposeSocketAddress r=getDefaultConnect(((JsonObject)arg0).get("Connect"),mapp);
return new SocketBridgeConfigItem(l,mapb,mapp);
}else {
throw new JsonParseException("not a object:"+arg0);
}
}
};
}
public static JsonSerializer<SocketBridgeConfigItem> getSocketBridgeConfigItemJsonSerializer(){
return new JsonSerializer<SocketBridgeConfigItem>() {
@Override
public JsonElement serialize(SocketBridgeConfigItem arg0, Type arg1, JsonSerializationContext arg2) {
return null;
}
};
}
public static void registerToGsonBuilder(GsonBuilder gsonBuilder) {
gsonBuilder.registerTypeAdapter(SocketBridgeConfigItem.class, getSocketBridgeConfigItemJsonDeserializer());
gsonBuilder.registerTypeAdapter(SocketBridgeConfigItem.class, getSocketBridgeConfigItemJsonSerializer());
}*/
public Proxy createProxy(KLALBController controller) throws IOException {
HostPortMap mapp=new HostPortMap();
LinkedHashMap<String, SocketBridgeFactory>mapb=new LinkedHashMap<>();
MultipurposeSocketAddress l=Listen;
SocketBridgeFactory bdg=getDefaultBridgeFactory(Bridge,mapb,controller);
MultipurposeSocketAddress r=getDefaultConnect(Connect,mapp);
return new SocketToSocketProxy(l ,new MultipurposeSocketAddress("0.0.0.0:0"), r,mapp,bdg,mapb);
}
private MultipurposeSocketAddress getDefaultConnect(HostPortMap connect2, LinkedHashMap<String, MultipurposeSocketAddress> mapp) {
connect2.entrySet().forEach((en)->{
mapp.put(en.getKey(), en.getValue());
});
return mapp.get("DEFAULT");
}
private SocketBridgeFactory getDefaultBridgeFactory(LinkedHashMap<String, String> bridge2, LinkedHashMap<String, SocketBridgeFactory> mapp, KLALBController controller) {
bridge2.entrySet().forEach((en)->{
mapp.put(en.getKey(), getFactoryByJobj(en.getValue(), controller));
});
return mapp.get("DEFAULT");
}private SocketBridgeFactory getFactoryByJobj(String string,KLALBController controller) {
if(string.startsWith("SocketBridge")) {
return new DefaultSocketBridgeFactory();
}else if(string.startsWith("MinecraftSocketBridge")) {
return new DefaultMinecraftSocketBridgeFactory(controller.getSelf().getAddress(), Integer.parseInt(string.substring(21)));
}
throw new IllegalArgumentException("unknown SocketBridge type:"+string);
}
}