Added server browser

This commit is contained in:
Anuken
2018-01-13 13:41:11 -05:00
parent 7c014de2c5
commit f4635b2882
12 changed files with 541 additions and 331 deletions

View File

@@ -5,8 +5,10 @@ import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet;
import com.esotericsoftware.kryonet.*;
import com.esotericsoftware.kryonet.FrameworkMessage.DiscoverHost;
import com.esotericsoftware.kryonet.serialization.Serialization;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.net.Address;
import io.anuke.mindustry.net.Host;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.ClientProvider;
import io.anuke.mindustry.net.Net.SendMode;
@@ -14,21 +16,22 @@ import io.anuke.mindustry.net.Packets.Connect;
import io.anuke.mindustry.net.Packets.Disconnect;
import io.anuke.mindustry.net.Registrator;
import io.anuke.ucore.UCore;
import io.anuke.ucore.function.Consumer;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.List;
public class KryoClient implements ClientProvider{
Client client;
ObjectMap<InetAddress, Address> addresses = new ObjectMap<>();
ObjectMap<InetAddress, Host> addresses = new ObjectMap<>();
ClientDiscoveryHandler handler;
public KryoClient(){
client = new Client();
client.setDiscoveryHandler(new ClientDiscoveryHandler() {
handler = new ClientDiscoveryHandler() {
@Override
public DatagramPacket onRequestNewDatagramPacket() {
return new DatagramPacket(new byte[32], 32);
@@ -37,16 +40,19 @@ public class KryoClient implements ClientProvider{
@Override
public void onDiscoveredHost(DatagramPacket datagramPacket) {
ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData());
Address address = KryoRegistrator.readServerData(datagramPacket.getAddress(), buffer);
Host address = KryoRegistrator.readServerData(datagramPacket.getAddress(), buffer);
addresses.put(datagramPacket.getAddress(), address);
UCore.log("Host data found: " + Arrays.toString(datagramPacket.getData()));
UCore.log("Host data found: " + buffer.capacity() + " bytes.");
}
@Override
public void onFinally() {
}
});
};
client = new Client();
client.setDiscoveryHandler(handler);
client.addListener(new Listener(){
@Override
@@ -81,7 +87,8 @@ public class KryoClient implements ClientProvider{
Net.handleClientReceived(object);
}catch (Exception e){
if(e instanceof KryoNetException && e.getMessage() != null && e.getMessage().toLowerCase().contains("incorrect")) {
UCore.log("Mismatch!");
Gdx.app.postRunnable(() -> Vars.ui.showError("$text.server.mismatch"));
Vars.netClient.disconnectQuietly();
}else{
Gdx.app.postRunnable(() -> {
throw new RuntimeException(e);
@@ -138,14 +145,56 @@ public class KryoClient implements ClientProvider{
}
@Override
public Array<Address> discover(){
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> invalid){
Thread thread = new Thread(() -> {
try {
Serialization ser = (Serialization) UCore.getPrivate(client, "serialization");
DatagramSocket socket = new DatagramSocket();
ByteBuffer dataBuffer = ByteBuffer.allocate(64);
ser.write(dataBuffer, new DiscoverHost());
dataBuffer.flip();
byte[] data = new byte[dataBuffer.limit()];
dataBuffer.get(data);
socket.send(new DatagramPacket(data, data.length, InetAddress.getByName(address), port));
socket.setSoTimeout(2000);
addresses.clear();
DatagramPacket packet = handler.onRequestNewDatagramPacket();
socket.receive(packet);
handler.onDiscoveredHost(packet);
Host host = addresses.values().next();
if (host != null) {
Gdx.app.postRunnable(() -> valid.accept(host));
} else {
Gdx.app.postRunnable(() -> invalid.accept(new IOException("Outdated server.")));
}
} catch (IOException e) {
Gdx.app.postRunnable(() -> invalid.accept(e));
}
});
thread.setDaemon(true);
thread.start();
}
@Override
public Array<Host> discover(){
addresses.clear();
List<InetAddress> list = client.discoverHosts(Vars.port, 3000);
ObjectSet<String> hostnames = new ObjectSet<>();
Array<Address> result = new Array<>();
Array<Host> result = new Array<>();
for(InetAddress a : list){
if(!hostnames.contains(a.getHostName())) {
Address address = addresses.get(a);
Host address = addresses.get(a);
if(address != null) result.add(address);
}

View File

@@ -2,7 +2,7 @@ package io.anuke.kryonet;
import com.esotericsoftware.kryo.Kryo;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.net.Address;
import io.anuke.mindustry.net.Host;
import io.anuke.mindustry.net.Net;
import java.net.InetAddress;
@@ -22,7 +22,7 @@ public class KryoRegistrator {
return buffer;
}
public static Address readServerData(InetAddress ia, ByteBuffer buffer){
public static Host readServerData(InetAddress ia, ByteBuffer buffer){
//old version address.
if(buffer.capacity() == 4) return null;
@@ -31,6 +31,6 @@ public class KryoRegistrator {
buffer.get(sname);
int players = buffer.getInt();
return new Address(new String(sname), ia.getHostAddress(), players);
return new Host(new String(sname), ia.getHostAddress(), players);
}
}

View File

@@ -2,7 +2,10 @@ package io.anuke.kryonet;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.IntArray;
import com.esotericsoftware.kryonet.*;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.FrameworkMessage;
import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Server;
import com.esotericsoftware.kryonet.util.InputStreamSender;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode;
@@ -19,9 +22,7 @@ import io.anuke.ucore.UCore;
import io.anuke.ucore.core.Timers;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.util.Arrays;
public class KryoServer implements ServerProvider {
@@ -30,16 +31,12 @@ public class KryoServer implements ServerProvider {
public KryoServer(){
server = new Server(4096*2, 2048); //TODO tweak
server.setDiscoveryHandler(new ServerDiscoveryHandler() {
@Override
public boolean onDiscoverHost(DatagramChannel datagramChannel, InetSocketAddress fromAddress) throws IOException {
ByteBuffer buffer = KryoRegistrator.writeServerData();
UCore.log("Replying to discover request with buffer of size " + buffer.capacity());
buffer.position(0);
datagramChannel.send(buffer, fromAddress);
return true;
}
server.setDiscoveryHandler((datagramChannel, fromAddress) -> {
ByteBuffer buffer = KryoRegistrator.writeServerData();
UCore.log("Replying to discover request with buffer of size " + buffer.capacity());
buffer.position(0);
datagramChannel.send(buffer, fromAddress);
return true;
});
server.addListener(new Listener(){