diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 0cbd003d69..c7048c46ab 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -18,6 +18,7 @@ import io.anuke.ucore.scene.ui.layout.Cell; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.utils.UIUtils; import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Strings; import static io.anuke.mindustry.Vars.*; @@ -254,6 +255,7 @@ public class JoinDialog extends FloatingDialog{ local.table("button", t -> { t.label(() -> "[accent]" + Bundles.get("text.hosts.discovering") + Strings.animated(4, 10f, ".")).pad(10f); }).growX(); + Log.info("begin of discover"); Net.discoverServers(this::addLocalHost, this::finishLocalHosts); } diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index d0f6783fe6..30e59bac14 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -26,11 +26,11 @@ import java.nio.channels.ClosedSelectorException; import static io.anuke.mindustry.Vars.*; public class KryoClient implements ClientProvider{ - Client client; + final Client client; + final Array foundAddresses = new Array<>(); + final ClientDiscoveryHandler handler; + final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); Consumer lastCallback; - Array foundAddresses = new Array<>(); - ClientDiscoveryHandler handler; - LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); public KryoClient(){ KryoCore.init(); @@ -178,24 +178,26 @@ public class KryoClient implements ClientProvider{ @Override public void pingHost(String address, int port, Consumer valid, Consumer invalid){ runAsync(() -> { - try { - DatagramSocket socket = new DatagramSocket(); - socket.send(new DatagramPacket(new byte[]{-2, 1}, 2, InetAddress.getByName(address), port)); + synchronized(handler){ + try{ + DatagramSocket socket = new DatagramSocket(); + socket.send(new DatagramPacket(new byte[]{-2, 1}, 2, InetAddress.getByName(address), port)); - socket.setSoTimeout(2000); + socket.setSoTimeout(2000); - lastCallback = valid; + lastCallback = valid; - DatagramPacket packet = handler.onRequestNewDatagramPacket(); + DatagramPacket packet = handler.onRequestNewDatagramPacket(); - socket.receive(packet); + socket.receive(packet); - ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); - Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer); + ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); + Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer); - Gdx.app.postRunnable(() -> valid.accept(host)); - } catch (Exception e) { - Gdx.app.postRunnable(() -> invalid.accept(e)); + Gdx.app.postRunnable(() -> valid.accept(host)); + }catch(Exception e){ + Gdx.app.postRunnable(() -> invalid.accept(e)); + } } }); } @@ -203,16 +205,18 @@ public class KryoClient implements ClientProvider{ @Override public void discover(Consumer callback, Runnable done){ runAsync(() -> { - foundAddresses.clear(); - lastCallback = callback; - client.discoverHosts(port, 3000); - Gdx.app.postRunnable(done); + synchronized(handler){ + foundAddresses.clear(); + lastCallback = callback; + client.discoverHosts(port, 3000); + Gdx.app.postRunnable(done); + } }); } @Override public void dispose(){ - try { + try{ client.dispose(); }catch (IOException e){ throw new RuntimeException(e);