Improved LAN discovery-- fixed #55

This commit is contained in:
Anuken
2018-01-13 11:10:49 -05:00
parent 5e2173fc54
commit 7c014de2c5
8 changed files with 64 additions and 18 deletions

View File

@@ -2,6 +2,7 @@ package io.anuke.kryonet;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet;
import com.esotericsoftware.kryonet.*;
import io.anuke.mindustry.Vars;
@@ -17,24 +18,28 @@ import io.anuke.ucore.UCore;
import java.io.IOException;
import java.net.DatagramPacket;
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<>();
public KryoClient(){
client = new Client();
client.setDiscoveryHandler(new ClientDiscoveryHandler() {
@Override
public DatagramPacket onRequestNewDatagramPacket() {
return new DatagramPacket(new byte[4], 4);
return new DatagramPacket(new byte[32], 32);
}
@Override
public void onDiscoveredHost(DatagramPacket datagramPacket) {
//TODO doesn't send data
UCore.log("DATA HOST FOUND: " + Arrays.toString(datagramPacket.getData()));
ByteBuffer buffer = ByteBuffer.wrap(datagramPacket.getData());
Address address = KryoRegistrator.readServerData(datagramPacket.getAddress(), buffer);
addresses.put(datagramPacket.getAddress(), address);
UCore.log("Host data found: " + Arrays.toString(datagramPacket.getData()));
}
@Override
@@ -139,8 +144,11 @@ public class KryoClient implements ClientProvider{
Array<Address> result = new Array<>();
for(InetAddress a : list){
if(!hostnames.contains(a.getHostName()))
result.add(new Address(a.getCanonicalHostName(), a.getHostAddress()));
if(!hostnames.contains(a.getHostName())) {
Address address = addresses.get(a);
if(address != null) result.add(address);
}
hostnames.add(a.getHostName());
}

View File

@@ -1,10 +1,36 @@
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.Net;
import java.net.InetAddress;
import java.nio.ByteBuffer;
public class KryoRegistrator {
public static void register(Kryo kryo){
//TODO register?
//TODO register stuff?
}
public static ByteBuffer writeServerData(){
ByteBuffer buffer = ByteBuffer.allocate(1 + Vars.player.name.length() + 4);
buffer.put((byte)Vars.player.name.length());
buffer.put(Vars.player.name.getBytes());
buffer.putInt(Net.getConnections().size + 1);
return buffer;
}
public static Address readServerData(InetAddress ia, ByteBuffer buffer){
//old version address.
if(buffer.capacity() == 4) return null;
byte length = buffer.get();
byte[] sname = new byte[length];
buffer.get(sname);
int players = buffer.getInt();
return new Address(new String(sname), ia.getHostAddress(), players);
}
}

View File

@@ -31,17 +31,13 @@ public class KryoServer implements ServerProvider {
public KryoServer(){
server = new Server(4096*2, 2048); //TODO tweak
server.setDiscoveryHandler(new ServerDiscoveryHandler() {
private ByteBuffer buffer = ByteBuffer.allocate(4);
{
buffer.putInt(987264236);
}
@Override
public boolean onDiscoverHost(DatagramChannel datagramChannel, InetSocketAddress fromAddress) throws IOException {
//TODO doesn't send data
UCore.log("SENDING DATA: " + Arrays.toString(buffer.array()));
datagramChannel.send(this.buffer, 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;
}
});
@@ -123,7 +119,13 @@ public class KryoServer implements ServerProvider {
public void host(int port) throws IOException {
server.bind(port, port);
Thread thread = new Thread(server, "Kryonet Server");
Thread thread = new Thread(() -> {
try{
server.run();
}catch (Exception e){
handleException(e);
}
}, "Kryonet Server");
thread.setDaemon(true);
thread.start();
}
@@ -209,6 +211,10 @@ public class KryoServer implements ServerProvider {
}
}
private void handleException(Exception e){
Gdx.app.postRunnable(() -> { throw new RuntimeException(e);});
}
Connection getByID(int id){
for(Connection con : server.getConnections()){
if(con.getID() == id){