Better web support, fixed application hanging in background
This commit is contained in:
@@ -546,7 +546,6 @@ public class Control extends Module{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
//UCore.log(input.placeMode, input.breakMode, input.lastPlaceMode);
|
|
||||||
|
|
||||||
if(Gdx.input != proxy){
|
if(Gdx.input != proxy){
|
||||||
Gdx.input = proxy;
|
Gdx.input = proxy;
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import io.anuke.ucore.scene.style.Drawable;
|
|||||||
import io.anuke.ucore.scene.ui.Dialog;
|
import io.anuke.ucore.scene.ui.Dialog;
|
||||||
import io.anuke.ucore.scene.ui.ScrollPane;
|
import io.anuke.ucore.scene.ui.ScrollPane;
|
||||||
import io.anuke.ucore.scene.ui.TextButton;
|
import io.anuke.ucore.scene.ui.TextButton;
|
||||||
import io.anuke.ucore.scene.ui.TextField.TextFieldFilter.DigitsOnlyFilter;
|
|
||||||
import io.anuke.ucore.scene.ui.layout.Table;
|
import io.anuke.ucore.scene.ui.layout.Table;
|
||||||
import io.anuke.ucore.util.Bundles;
|
import io.anuke.ucore.util.Bundles;
|
||||||
import io.anuke.ucore.util.Strings;
|
import io.anuke.ucore.util.Strings;
|
||||||
@@ -40,12 +39,13 @@ public class JoinDialog extends FloatingDialog {
|
|||||||
}).size(240f, 54f).get(), 100);
|
}).size(240f, 54f).get(), 100);
|
||||||
|
|
||||||
join.content().row();
|
join.content().row();
|
||||||
|
/*
|
||||||
join.content().add("$text.server.port").left();
|
join.content().add("$text.server.port").left();
|
||||||
Mindustry.platforms.addDialog(join.content()
|
Mindustry.platforms.addDialog(join.content()
|
||||||
.addField(Settings.getString("port"), new DigitsOnlyFilter(), text ->{
|
.addField(Settings.getString("port"), new DigitsOnlyFilter(), text ->{
|
||||||
Settings.putString("port", text);
|
Settings.putString("port", text);
|
||||||
Settings.save();
|
Settings.save();
|
||||||
}).size(240f, 54f).get());
|
}).size(240f, 54f).get());*/
|
||||||
join.buttons().defaults().size(140f, 60f).pad(4f);
|
join.buttons().defaults().size(140f, 60f).pad(4f);
|
||||||
join.buttons().addButton("$text.cancel", join::hide);
|
join.buttons().addButton("$text.cancel", join::hide);
|
||||||
join.buttons().addButton("$text.ok", () -> {
|
join.buttons().addButton("$text.ok", () -> {
|
||||||
@@ -56,14 +56,14 @@ public class JoinDialog extends FloatingDialog {
|
|||||||
setupRemote();
|
setupRemote();
|
||||||
refreshRemote();
|
refreshRemote();
|
||||||
}else{
|
}else{
|
||||||
renaming.port = Strings.parseInt(Settings.getString("port"));
|
//renaming.port = Strings.parseInt(Settings.getString("port"));
|
||||||
renaming.ip = Settings.getString("ip");
|
renaming.ip = Settings.getString("ip");
|
||||||
saveServers();
|
saveServers();
|
||||||
setupRemote();
|
setupRemote();
|
||||||
refreshRemote();
|
refreshRemote();
|
||||||
}
|
}
|
||||||
join.hide();
|
join.hide();
|
||||||
}).disabled(b -> Settings.getString("ip").isEmpty() || Strings.parseInt(Settings.getString("port")) == Integer.MIN_VALUE || Net.active());
|
}).disabled(b -> Settings.getString("ip").isEmpty() || Net.active());
|
||||||
|
|
||||||
join.shown(() -> {
|
join.shown(() -> {
|
||||||
join.getTitleLabel().setText(renaming != null ? "$text.server.edit" : "$text.server.add");
|
join.getTitleLabel().setText(renaming != null ? "$text.server.edit" : "$text.server.add");
|
||||||
@@ -83,8 +83,8 @@ public class JoinDialog extends FloatingDialog {
|
|||||||
//why are java lambdas this bad
|
//why are java lambdas this bad
|
||||||
TextButton[] buttons = {null};
|
TextButton[] buttons = {null};
|
||||||
|
|
||||||
TextButton button = buttons[0] = remote.addButton("[accent]"+server.ip + " / " + server.port, "clear", () -> {
|
TextButton button = buttons[0] = remote.addButton("[accent]"+server.ip, "clear", () -> {
|
||||||
if(!buttons[0].childrenPressed()) connect(server.ip, server.port);
|
if(!buttons[0].childrenPressed()) connect(server.ip, Vars.port);
|
||||||
}).width(w).height(120f).pad(4f).get();
|
}).width(w).height(120f).pad(4f).get();
|
||||||
|
|
||||||
button.getLabel().setWrap(true);
|
button.getLabel().setWrap(true);
|
||||||
@@ -145,10 +145,12 @@ public class JoinDialog extends FloatingDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void refreshLocal(){
|
void refreshLocal(){
|
||||||
local.clear();
|
if(!Vars.gwt) {
|
||||||
local.background("button");
|
local.clear();
|
||||||
local.label(() -> "[accent]" + Bundles.get("text.hosts.discovering") + new String(new char[(int)(Timers.time() / 10) % 4]).replace("\0", ".")).pad(10f);
|
local.background("button");
|
||||||
Net.discoverServers(this::addLocalHosts);
|
local.label(() -> "[accent]" + Bundles.get("text.hosts.discovering") + new String(new char[(int) (Timers.time() / 10) % 4]).replace("\0", ".")).pad(10f);
|
||||||
|
Net.discoverServers(this::addLocalHosts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(){
|
void setup(){
|
||||||
@@ -201,7 +203,7 @@ public class JoinDialog extends FloatingDialog {
|
|||||||
button.add("[lightgray]" + (a.players != 1 ? Bundles.format("text.players", a.players) :
|
button.add("[lightgray]" + (a.players != 1 ? Bundles.format("text.players", a.players) :
|
||||||
Bundles.format("text.players.single", a.players)));
|
Bundles.format("text.players.single", a.players)));
|
||||||
button.row();
|
button.row();
|
||||||
button.add("[lightgray]" + a.address + " / " + Vars.port).pad(4).left();
|
button.add("[lightgray]" + a.address).pad(4).left();
|
||||||
|
|
||||||
local.row();
|
local.row();
|
||||||
local.background((Drawable) null);
|
local.background((Drawable) null);
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ import io.anuke.mindustry.net.Packet;
|
|||||||
import io.anuke.mindustry.net.Packets.Connect;
|
import io.anuke.mindustry.net.Packets.Connect;
|
||||||
import io.anuke.mindustry.net.Packets.Disconnect;
|
import io.anuke.mindustry.net.Packets.Disconnect;
|
||||||
import io.anuke.mindustry.net.Registrator;
|
import io.anuke.mindustry.net.Registrator;
|
||||||
|
import io.anuke.ucore.core.Timers;
|
||||||
import io.anuke.ucore.function.Consumer;
|
import io.anuke.ucore.function.Consumer;
|
||||||
|
import io.anuke.ucore.util.Strings;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -103,6 +105,35 @@ public class WebsocketClient implements ClientProvider {
|
|||||||
@Override
|
@Override
|
||||||
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> failed) {
|
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> failed) {
|
||||||
failed.accept(new IOException());
|
failed.accept(new IOException());
|
||||||
|
Websocket socket = new Websocket("ws://" + address + ":" + Vars.webPort);
|
||||||
|
final boolean[] accepted = {false};
|
||||||
|
socket.addListener(new WebsocketListener() {
|
||||||
|
@Override
|
||||||
|
public void onClose() {
|
||||||
|
if(!accepted[0]) failed.accept(new IOException("Failed to connect to host."));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(String msg) {
|
||||||
|
String[] text = msg.split("\\|");
|
||||||
|
Host host = new Host(text[1], address, Strings.parseInt(text[0]));
|
||||||
|
valid.accept(host);
|
||||||
|
accepted[0] = true;
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOpen() {
|
||||||
|
socket.send("_ping_");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
socket.open();
|
||||||
|
Timers.runTask(60f*5, () -> {
|
||||||
|
if(!accepted[0]){
|
||||||
|
failed.accept(new IOException("Failed to connect to host."));
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -37,11 +37,11 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
public class KryoServer implements ServerProvider {
|
public class KryoServer implements ServerProvider {
|
||||||
final boolean debug = false;
|
final boolean debug = false;
|
||||||
final Server server;
|
final Server server;
|
||||||
final SocketServer webServer;
|
|
||||||
final ByteSerializer serializer = new ByteSerializer();
|
final ByteSerializer serializer = new ByteSerializer();
|
||||||
final ByteBuffer buffer = ByteBuffer.allocate(4096);
|
final ByteBuffer buffer = ByteBuffer.allocate(4096);
|
||||||
final CopyOnWriteArrayList<KryoConnection> connections = new CopyOnWriteArrayList<>();
|
final CopyOnWriteArrayList<KryoConnection> connections = new CopyOnWriteArrayList<>();
|
||||||
final Array<KryoConnection> array = new Array<>();
|
final Array<KryoConnection> array = new Array<>();
|
||||||
|
SocketServer webServer;
|
||||||
|
|
||||||
int lastconnection = 0;
|
int lastconnection = 0;
|
||||||
|
|
||||||
@@ -54,7 +54,6 @@ public class KryoServer implements ServerProvider {
|
|||||||
datagramChannel.send(buffer, fromAddress);
|
datagramChannel.send(buffer, fromAddress);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
webServer = new SocketServer(Vars.webPort);
|
|
||||||
|
|
||||||
Listener listener = new Listener(){
|
Listener listener = new Listener(){
|
||||||
|
|
||||||
@@ -136,6 +135,7 @@ public class KryoServer implements ServerProvider {
|
|||||||
public void host(int port) throws IOException {
|
public void host(int port) throws IOException {
|
||||||
lastconnection = 0;
|
lastconnection = 0;
|
||||||
server.bind(port, port);
|
server.bind(port, port);
|
||||||
|
webServer = new SocketServer(Vars.webPort);
|
||||||
webServer.start();
|
webServer.start();
|
||||||
|
|
||||||
Thread thread = new Thread(() -> {
|
Thread thread = new Thread(() -> {
|
||||||
@@ -153,14 +153,22 @@ public class KryoServer implements ServerProvider {
|
|||||||
public void close() {
|
public void close() {
|
||||||
UCore.setPrivate(server, "shutdown", true);
|
UCore.setPrivate(server, "shutdown", true);
|
||||||
|
|
||||||
new Thread(() ->{
|
Thread thread = new Thread(() ->{
|
||||||
try {
|
try {
|
||||||
server.close();
|
server.close();
|
||||||
webServer.stop();
|
webServer.stop(1); //please die, right now
|
||||||
|
//kill them all
|
||||||
|
for(Thread worker : Thread.getAllStackTraces().keySet()){
|
||||||
|
if(worker.getName().contains("WebSocketWorker")){
|
||||||
|
worker.interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
Gdx.app.postRunnable(() -> {throw new RuntimeException(e);});
|
Gdx.app.postRunnable(() -> {throw new RuntimeException(e);});
|
||||||
}
|
}
|
||||||
}).run();
|
});
|
||||||
|
thread.setDaemon(true);
|
||||||
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -247,7 +255,13 @@ public class KryoServer implements ServerProvider {
|
|||||||
public void dispose(){
|
public void dispose(){
|
||||||
try {
|
try {
|
||||||
server.dispose();
|
server.dispose();
|
||||||
webServer.stop();
|
webServer.stop(1);
|
||||||
|
//kill them all
|
||||||
|
for(Thread thread : Thread.getAllStackTraces().keySet()){
|
||||||
|
if(thread.getName().contains("WebSocketWorker")){
|
||||||
|
thread.interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@@ -372,15 +386,19 @@ public class KryoServer implements ServerProvider {
|
|||||||
@Override
|
@Override
|
||||||
public void onMessage(WebSocket conn, String message) {
|
public void onMessage(WebSocket conn, String message) {
|
||||||
try {
|
try {
|
||||||
if(debug) UCore.log("Got message: " + message);
|
if(message.equals("_ping_")){
|
||||||
KryoConnection k = getBySocket(conn);
|
conn.send(connections.size() + "|" + Vars.player.name);
|
||||||
if (k == null) return;
|
}else {
|
||||||
|
if (debug) UCore.log("Got message: " + message);
|
||||||
|
KryoConnection k = getBySocket(conn);
|
||||||
|
if (k == null) return;
|
||||||
|
|
||||||
byte[] out = Base64Coder.decode(message);
|
byte[] out = Base64Coder.decode(message);
|
||||||
if(debug) UCore.log("Decoded: " + Arrays.toString(out));
|
if (debug) UCore.log("Decoded: " + Arrays.toString(out));
|
||||||
ByteBuffer buffer = ByteBuffer.wrap(out);
|
ByteBuffer buffer = ByteBuffer.wrap(out);
|
||||||
Object o = serializer.read(buffer);
|
Object o = serializer.read(buffer);
|
||||||
Net.handleServerReceived(o, k.id);
|
Net.handleServerReceived(o, k.id);
|
||||||
|
}
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
UCore.log("Error reading message!");
|
UCore.log("Error reading message!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
Reference in New Issue
Block a user