Improved LAN discovery-- fixed #55
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user