Switched to ArcNet networking extension

This commit is contained in:
Anuken
2019-04-17 21:59:26 -04:00
parent 4eee472043
commit 01e1438382
11 changed files with 46 additions and 151 deletions

View File

@@ -23,8 +23,8 @@ import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.mindustry.ui.dialogs.FileChooser;
import io.anuke.net.KryoClient; import io.anuke.mindustry.net.ArcNetClient;
import io.anuke.net.KryoServer; import io.anuke.mindustry.net.ArcNetServer;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
@@ -111,8 +111,8 @@ public class AndroidLauncher extends AndroidApplication{
} }
config.hideStatusBar = true; config.hideStatusBar = true;
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new KryoServer()); Net.setServerProvider(new ArcNetServer());
initialize(new Mindustry(), config); initialize(new Mindustry(), config);
checkFiles(getIntent()); checkFiles(getIntent());
} }

View File

@@ -202,7 +202,7 @@ project(":core"){
compile arcModule("arc-core") compile arcModule("arc-core")
compile arcModule("extensions:freetype") compile arcModule("extensions:freetype")
//compile arcModule("extensions:postprocessing") compile arcModule("extensions:arcnet")
if(localArc() && debugged()) compile arcModule("extensions:recorder") if(localArc() && debugged()) compile arcModule("extensions:recorder")
compileOnly project(":annotations") compileOnly project(":annotations")
@@ -259,7 +259,6 @@ project(":net"){
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile "org.lz4:lz4-java:1.4.1" compile "org.lz4:lz4-java:1.4.1"
compile 'com.github.Anuken:kryonet:a64d2280880e80566ca1bdaffa55de43e51cad38'
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893' compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
} }
} }

View File

@@ -10,8 +10,8 @@ import io.anuke.mindustry.Mindustry;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.net.KryoClient; import io.anuke.mindustry.net.ArcNetClient;
import io.anuke.net.KryoServer; import io.anuke.mindustry.net.ArcNetServer;
public class DesktopLauncher extends Lwjgl3Application{ public class DesktopLauncher extends Lwjgl3Application{
@@ -45,8 +45,8 @@ public class DesktopLauncher extends Lwjgl3Application{
Platform.instance = new DesktopPlatform(arg); Platform.instance = new DesktopPlatform(arg);
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new KryoServer()); Net.setServerProvider(new ArcNetServer());
new DesktopLauncher(new Mindustry(), config); new DesktopLauncher(new Mindustry(), config);
}catch(Throwable e){ }catch(Throwable e){
CrashHandler.handle(e); CrashHandler.handle(e);

View File

@@ -10,8 +10,8 @@ import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.net.KryoClient; import io.anuke.mindustry.net.ArcNetClient;
import io.anuke.net.KryoServer; import io.anuke.mindustry.net.ArcNetServer;
import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.foundation.NSAutoreleasePool;
import org.robovm.apple.foundation.NSURL; import org.robovm.apple.foundation.NSURL;
import org.robovm.apple.uikit.*; import org.robovm.apple.uikit.*;
@@ -27,8 +27,8 @@ public class IOSLauncher extends IOSApplication.Delegate{
@Override @Override
protected IOSApplication createApplication(){ protected IOSApplication createApplication(){
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new KryoServer()); Net.setServerProvider(new ArcNetServer());
if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){ if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){
Unit.dp.addition = 0.5f; Unit.dp.addition = 0.5f;

View File

@@ -1,11 +1,10 @@
package io.anuke.net; package io.anuke.mindustry.net;
import com.esotericsoftware.kryonet.*;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Consumer;
import io.anuke.arc.net.*;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Net.ClientProvider; import io.anuke.mindustry.net.Net.ClientProvider;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Packets.Connect; import io.anuke.mindustry.net.Packets.Connect;
@@ -21,24 +20,22 @@ import java.nio.channels.ClosedSelectorException;
import static io.anuke.mindustry.Vars.netClient; import static io.anuke.mindustry.Vars.netClient;
import static io.anuke.mindustry.Vars.port; import static io.anuke.mindustry.Vars.port;
public class KryoClient implements ClientProvider{ public class ArcNetClient implements ClientProvider{
final Client client; final Client client;
final Array<InetAddress> foundAddresses = new Array<>(); final Array<InetAddress> foundAddresses = new Array<>();
final ClientDiscoveryHandler handler; final ClientDiscoveryHandler handler;
final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor();
Consumer<Host> lastCallback; Consumer<Host> lastCallback;
public KryoClient(){ public ArcNetClient(){
KryoCore.init();
handler = new ClientDiscoveryHandler(){ handler = new ClientDiscoveryHandler(){
@Override @Override
public DatagramPacket onRequestNewDatagramPacket(){ public DatagramPacket newDatagramPacket(){
return new DatagramPacket(new byte[128], 128); return new DatagramPacket(new byte[128], 128);
} }
@Override @Override
public void onDiscoveredHost(DatagramPacket datagramPacket){ public void discoveredHost(DatagramPacket datagramPacket){
ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData()); ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData());
Host host = NetworkIO.readServerData(datagramPacket.getAddress().getHostAddress(), buffer); Host host = NetworkIO.readServerData(datagramPacket.getAddress().getHostAddress(), buffer);
for(InetAddress address : foundAddresses){ for(InetAddress address : foundAddresses){
@@ -51,15 +48,15 @@ public class KryoClient implements ClientProvider{
} }
@Override @Override
public void onFinally(){ public void finish(){
} }
}; };
client = new Client(8192, 4096, connection -> new ByteSerializer()); client = new Client(8192, 4096, new PacketSerializer());
client.setDiscoveryHandler(handler); client.setDiscoveryHandler(handler);
Listener listener = new Listener(){ NetListener listener = new NetListener(){
@Override @Override
public void connected(Connection connection){ public void connected(Connection connection){
Connect c = new Connect(); Connect c = new Connect();
@@ -95,11 +92,7 @@ public class KryoClient implements ClientProvider{
} }
}; };
if(KryoCore.fakeLag){ client.addListener(listener);
client.addListener(new Listener.LagListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, listener));
}else{
client.addListener(listener);
}
} }
private static boolean isLocal(InetAddress addr){ private static boolean isLocal(InetAddress addr){
@@ -133,7 +126,7 @@ public class KryoClient implements ClientProvider{
}catch(Exception e){ }catch(Exception e){
if(!(e instanceof ClosedSelectorException)) handleException(e); if(!(e instanceof ClosedSelectorException)) handleException(e);
} }
}, "Kryonet Client"); }, "Net Client");
updateThread.setDaemon(true); updateThread.setDaemon(true);
updateThread.start(); updateThread.start();
@@ -188,7 +181,7 @@ public class KryoClient implements ClientProvider{
lastCallback = valid; lastCallback = valid;
DatagramPacket packet = handler.onRequestNewDatagramPacket(); DatagramPacket packet = handler.newDatagramPacket();
socket.receive(packet); socket.receive(packet);
@@ -231,7 +224,7 @@ public class KryoClient implements ClientProvider{
} }
private void handleException(Exception e){ private void handleException(Exception e){
if(e instanceof KryoNetException){ if(e instanceof ArcNetException){
Core.app.post(() -> Net.showError(new IOException("mismatch"))); Core.app.post(() -> Net.showError(new IOException("mismatch")));
}else{ }else{
Core.app.post(() -> Net.showError(e)); Core.app.post(() -> Net.showError(e));

View File

@@ -1,15 +1,12 @@
package io.anuke.net; package io.anuke.mindustry.net;
import com.dosse.upnp.UPnP; import com.dosse.upnp.UPnP;
import com.esotericsoftware.kryonet.*;
import com.esotericsoftware.kryonet.Listener.LagListener;
import com.esotericsoftware.kryonet.util.InputStreamSender;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.net.*;
import io.anuke.arc.util.Log; import io.anuke.arc.util.Log;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Net.ServerProvider; import io.anuke.mindustry.net.Net.ServerProvider;
import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Packets.*;
@@ -22,7 +19,7 @@ import java.nio.channels.ClosedSelectorException;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
public class KryoServer implements ServerProvider{ public class ArcNetServer implements ServerProvider{
final Server server; final Server server;
final CopyOnWriteArrayList<KryoConnection> connections = new CopyOnWriteArrayList<>(); final CopyOnWriteArrayList<KryoConnection> connections = new CopyOnWriteArrayList<>();
final CopyOnWriteArraySet<Integer> missing = new CopyOnWriteArraySet<>(); final CopyOnWriteArraySet<Integer> missing = new CopyOnWriteArraySet<>();
@@ -32,18 +29,15 @@ public class KryoServer implements ServerProvider{
int lastconnection = 0; int lastconnection = 0;
public KryoServer(){ public ArcNetServer(){
KryoCore.init(); server = new Server(4096 * 2, 4096, new PacketSerializer());
server = new Server(4096 * 2, 4096, connection -> new ByteSerializer());
server.setDiscoveryHandler((datagramChannel, fromAddress) -> { server.setDiscoveryHandler((datagramChannel, fromAddress) -> {
ByteBuffer buffer = NetworkIO.writeServerData(); ByteBuffer buffer = NetworkIO.writeServerData();
buffer.position(0); buffer.position(0);
datagramChannel.send(buffer, fromAddress); datagramChannel.send(buffer, fromAddress);
return true;
}); });
Listener listener = new Listener(){ NetListener listener = new NetListener(){
@Override @Override
public void connected(Connection connection){ public void connected(Connection connection){
@@ -92,11 +86,7 @@ public class KryoServer implements ServerProvider{
} }
}; };
if(KryoCore.fakeLag){ server.addListener(listener);
server.addListener(new LagListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, listener));
}else{
server.addListener(listener);
}
} }
@Override @Override
@@ -150,7 +140,7 @@ public class KryoServer implements ServerProvider{
}catch(Throwable e){ }catch(Throwable e){
if(!(e instanceof ClosedSelectorException)) handleException(e); if(!(e instanceof ClosedSelectorException)) handleException(e);
} }
}, "Kryonet Server"); }, "Net Server");
serverThread.setDaemon(true); serverThread.setDaemon(true);
serverThread.start(); serverThread.start();
} }

View File

@@ -1,7 +1,7 @@
package io.anuke.net; package io.anuke.mindustry.net;
import com.esotericsoftware.kryonet.FrameworkMessage; import io.anuke.arc.net.FrameworkMessage;
import com.esotericsoftware.kryonet.FrameworkMessage.*; import io.anuke.arc.net.FrameworkMessage.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -15,12 +15,8 @@ public class FrameworkSerializer{
buffer.putInt(p.id); buffer.putInt(p.id);
buffer.put(p.isReply ? 1 : (byte)0); buffer.put(p.isReply ? 1 : (byte)0);
}else if(message instanceof DiscoverHost){ }else if(message instanceof DiscoverHost){
DiscoverHost p = (DiscoverHost)message;
buffer.put((byte)1); buffer.put((byte)1);
}else if(message instanceof KeepAlive){ }else if(message instanceof KeepAlive){
KeepAlive p = (KeepAlive)message;
buffer.put((byte)2); buffer.put((byte)2);
}else if(message instanceof RegisterUDP){ }else if(message instanceof RegisterUDP){
RegisterUDP p = (RegisterUDP)message; RegisterUDP p = (RegisterUDP)message;

View File

@@ -1,16 +1,14 @@
package io.anuke.net; package io.anuke.mindustry.net;
import com.esotericsoftware.kryonet.FrameworkMessage; import io.anuke.arc.net.FrameworkMessage;
import com.esotericsoftware.kryonet.serialization.Serialization; import io.anuke.arc.net.NetSerializer;
import io.anuke.arc.function.Supplier; import io.anuke.arc.function.Supplier;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.net.Packet;
import io.anuke.mindustry.net.Registrator;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class ByteSerializer implements Serialization{ public class PacketSerializer implements NetSerializer{
@Override @Override
public void write(ByteBuffer byteBuffer, Object o){ public void write(ByteBuffer byteBuffer, Object o){
@@ -39,19 +37,4 @@ public class ByteSerializer implements Serialization{
return packet; return packet;
} }
} }
@Override
public int getLengthLength(){
return 2;
}
@Override
public void writeLength(ByteBuffer byteBuffer, int i){
byteBuffer.putShort((short)i);
}
@Override
public int readLength(ByteBuffer byteBuffer){
return byteBuffer.getShort();
}
} }

View File

@@ -1,66 +0,0 @@
package io.anuke.net;
import com.esotericsoftware.kryonet.util.Log;
import com.esotericsoftware.kryonet.util.Log.Logger;
import io.anuke.arc.util.ColorCodes;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.ScheduledExecutorService;
import static io.anuke.mindustry.Vars.headless;
/** Utilities and configs for kryo module. */
public class KryoCore{
public static boolean fakeLag = false;
public static final int fakeLagMax = 500;
public static final int fakeLagMin = 0;
public static final float fakeLagDrop = 0.1f;
public static final float fakeLagDuplicate = 0.1f;
public static boolean lastUDP;
private static ScheduledExecutorService threadPool;
public static void init(){
Log.set(fakeLag ? Log.LEVEL_DEBUG : Log.LEVEL_WARN);
Log.setLogger(new Logger(){
public void log(int level, String category, String message, Throwable ex){
if(fakeLag){
if(message.contains("UDP")){
lastUDP = true;
}else if(message.contains("TCP")){
lastUDP = false;
}
return;
}
StringBuilder builder = new StringBuilder(256);
if(headless)
builder.append(ColorCodes.BLUE);
builder.append("Net Error: ");
builder.append(message);
if(ex != null){
StringWriter writer = new StringWriter(256);
ex.printStackTrace(new PrintWriter(writer));
builder.append('\n');
builder.append(writer.toString().trim());
}
if(headless)
builder.append(ColorCodes.RESET);
io.anuke.arc.util.Log.info("&b" + builder.toString());
}
});
}
private static int calculateLag(){
return fakeLagMin + (int)(Math.random() * (fakeLagMax - fakeLagMin));
}
}

View File

@@ -5,8 +5,8 @@ import io.anuke.arc.ApplicationListener;
import io.anuke.arc.backends.headless.HeadlessApplication; import io.anuke.arc.backends.headless.HeadlessApplication;
import io.anuke.arc.backends.headless.HeadlessApplicationConfiguration; import io.anuke.arc.backends.headless.HeadlessApplicationConfiguration;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.net.KryoClient; import io.anuke.mindustry.net.ArcNetClient;
import io.anuke.net.KryoServer; import io.anuke.mindustry.net.ArcNetServer;
public class ServerLauncher extends HeadlessApplication{ public class ServerLauncher extends HeadlessApplication{
@@ -17,8 +17,8 @@ public class ServerLauncher extends HeadlessApplication{
public static void main(String[] args){ public static void main(String[] args){
try{ try{
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new KryoServer()); Net.setServerProvider(new ArcNetServer());
HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration(); HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
new ServerLauncher(new MindustryServer(args), config); new ServerLauncher(new MindustryServer(args), config);

View File

@@ -26,7 +26,7 @@ if(!hasProperty("release")){
use(':Arc:extensions', '../Arc/extensions') use(':Arc:extensions', '../Arc/extensions')
use(':Arc:extensions:freetype', '../Arc/extensions/freetype') use(':Arc:extensions:freetype', '../Arc/extensions/freetype')
use(':Arc:extensions:recorder', '../Arc/extensions/recorder') use(':Arc:extensions:recorder', '../Arc/extensions/recorder')
//use(':Arc:extensions:postprocessing', '../Arc/extensions/postprocessing') use(':Arc:extensions:arcnet', '../Arc/extensions/arcnet')
use(':Arc:backends', '../Arc/backends') use(':Arc:backends', '../Arc/backends')
use(':Arc:backends:backend-lwjgl3', '../Arc/backends/backend-lwjgl3') use(':Arc:backends:backend-lwjgl3', '../Arc/backends/backend-lwjgl3')
use(':Arc:backends:backend-android', '../Arc/backends/backend-android') use(':Arc:backends:backend-android', '../Arc/backends/backend-android')