From e2a784e5e93b149ec3a118e3a8ab5895fc47bdb2 Mon Sep 17 00:00:00 2001 From: Nicolas BARBOTIN Date: Fri, 9 Feb 2018 17:40:22 +0100 Subject: [PATCH] * Finished server block. --- README.md | 1 - .../net/montoyo/wd/client/ClientProxy.java | 7 ++++-- .../net/montoyo/wd/client/gui/GuiServer.java | 6 +++++ .../montoyo/wd/miniserv/AbstractClient.java | 20 ++++++++++++----- .../net/montoyo/wd/miniserv/Constants.java | 3 +++ .../montoyo/wd/miniserv/client/Client.java | 22 ++++++++++++++++++- .../montoyo/wd/miniserv/server/Server.java | 7 +++++- .../wd/miniserv/server/ServerClient.java | 16 ++++++++++++++ .../assets/webdisplays/lang/en_us.lang | 3 ++- 9 files changed, 74 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 346e35c..2c83404 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex ### Missing features * Peripheral: OpenComputers interface * Read config (see "Config elements" below) -* Miniserv timeout ### TODO * French translations diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 6ffce9d..8816342 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -52,6 +52,7 @@ import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.data.GuiData; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.item.ItemMulti; +import net.montoyo.wd.miniserv.Constants; import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.net.server.SMessagePadCtrl; import net.montoyo.wd.net.server.SMessageScreenCtrl; @@ -87,6 +88,8 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi private MinePadRenderer minePadRenderer; private JSQueryDispatcher jsDispatcher; private LaserPointerRenderer laserPointerRenderer; + + //Miniserv handling private int miniservPort; private boolean msClientStarted; @@ -550,8 +553,8 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi //Handle JS queries jsDispatcher.handleQueries(); - //Stop miniserv client - if(mc.player == null && msClientStarted) { + //Miniserv + if(msClientStarted && mc.player == null) { msClientStarted = false; Client.getInstance().stop(); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index b67d250..3e8483e 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -644,6 +644,12 @@ public class GuiServer extends WDScreen { queueTask(task); } + @CommandHandler("reconnect") + public void commandReconnect() { + Client.getInstance().stop(); + WebDisplays.NET_HANDLER.sendToServer(Client.getInstance().beginConnection()); + } + private void startFileUpload(File f, boolean quit) { if(quit) quitUploadWizard(); diff --git a/src/main/java/net/montoyo/wd/miniserv/AbstractClient.java b/src/main/java/net/montoyo/wd/miniserv/AbstractClient.java index c9ab037..103f10c 100644 --- a/src/main/java/net/montoyo/wd/miniserv/AbstractClient.java +++ b/src/main/java/net/montoyo/wd/miniserv/AbstractClient.java @@ -50,7 +50,7 @@ public abstract class AbstractClient { protected abstract void onWriteError(); - public void readyRead(ByteBuffer bb) { + public final void readyRead(ByteBuffer bb) { while(bb.remaining() > 0) { if(packetReader.readFrom(bb)) { //End of packet byte[] pkt = packetReader.getPacketData(); @@ -79,14 +79,18 @@ public abstract class AbstractClient { packetReader.reset(); } } + + onDataReceived(); } - public void readyWrite() throws Throwable { + public final void readyWrite() throws Throwable { if(sendBuffer.remaining() > 0 || fillSendBuffer()) { int sent = socket.write(sendBuffer); if(sent < 0) onWriteError(); + else if(sent > 0) + onDataSent(); } } @@ -115,7 +119,7 @@ public abstract class AbstractClient { return pos > 0; } - public void sendPacket(OutgoingPacket pkt) { + public final void sendPacket(OutgoingPacket pkt) { synchronized(sendQueue) { sendQueue.offer(pkt); @@ -138,15 +142,21 @@ public abstract class AbstractClient { } } - protected byte[] getCurrentPacketRawData() { + protected final byte[] getCurrentPacketRawData() { return packetReader.getPacketData(); } - protected void clearSendQueue() { + protected final void clearSendQueue() { synchronized(sendQueue) { packetWriter.clear(); sendQueue.clear(); } } + protected void onDataReceived() { + } + + protected void onDataSent() { + } + } diff --git a/src/main/java/net/montoyo/wd/miniserv/Constants.java b/src/main/java/net/montoyo/wd/miniserv/Constants.java index 408b41e..40c32bc 100644 --- a/src/main/java/net/montoyo/wd/miniserv/Constants.java +++ b/src/main/java/net/montoyo/wd/miniserv/Constants.java @@ -22,4 +22,7 @@ public abstract class Constants { public static int GETF_STATUS_CONNECTION_LOST = 4; public static int GETF_STATUS_TIMED_OUT = 5; + public static long CLIENT_TIMEOUT = 30000L; + public static long CLIENT_PING_PERIOD = 5000L; + } diff --git a/src/main/java/net/montoyo/wd/miniserv/client/Client.java b/src/main/java/net/montoyo/wd/miniserv/client/Client.java index edd8448..96def2b 100644 --- a/src/main/java/net/montoyo/wd/miniserv/client/Client.java +++ b/src/main/java/net/montoyo/wd/miniserv/client/Client.java @@ -47,6 +47,7 @@ public class Client extends AbstractClient implements Runnable { private final ArrayDeque tasks = new ArrayDeque<>(); private ClientTask currentTask; private volatile boolean authenticated; + private long lastPingTime; public SMessageMiniservConnect beginConnection() { if(keyPair == null) { @@ -173,6 +174,7 @@ public class Client extends AbstractClient implements Runnable { connPacket.writeLong(clientUUID.getMostSignificantBits()); connPacket.writeLong(clientUUID.getLeastSignificantBits()); sendPacket(connPacket); + lastPingTime = System.currentTimeMillis(); while(getRunning()) { try { @@ -214,7 +216,8 @@ public class Client extends AbstractClient implements Runnable { } private void unsafeLoop() throws Throwable { - selector.select(); + long timeBeforePing = Constants.CLIENT_PING_PERIOD - (System.currentTimeMillis() - lastPingTime); + selector.select(Math.max(0, timeBeforePing)); if(currentTask == null || currentTask.isCanceled()) nextTask(); @@ -243,6 +246,14 @@ public class Client extends AbstractClient implements Runnable { } } } + + long t = System.currentTimeMillis(); + if(t - lastPingTime >= Constants.CLIENT_PING_PERIOD) { + OutgoingPacket pkt = new OutgoingPacket(); + pkt.writeByte(PacketID.PING.ordinal()); + sendPacket(pkt); + lastPingTime = t; + } } @Override @@ -326,6 +337,10 @@ public class Client extends AbstractClient implements Runnable { ((ClientTaskDeleteFile) currentTask).onStatusPacket(dis.readByte()); } + @PacketHandler(PacketID.PING) + public void handlePing(DataInputStream dis) { + } + public void nextTask() { if(currentTask != null) currentTask.onFinished(); @@ -365,4 +380,9 @@ public class Client extends AbstractClient implements Runnable { selector.wakeup(); } + @Override + protected void onDataSent() { + lastPingTime = System.currentTimeMillis(); + } + } diff --git a/src/main/java/net/montoyo/wd/miniserv/server/Server.java b/src/main/java/net/montoyo/wd/miniserv/server/Server.java index 136bba6..8906d55 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/Server.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/Server.java @@ -131,7 +131,7 @@ public class Server implements Runnable { } private void loopUnsafe() throws Throwable { - selector.select(); + selector.select(1000); //Allow the server to kick timed-out clients for(SelectionKey key: selector.selectedKeys()) { if(key.isAcceptable()) { @@ -194,11 +194,16 @@ public class Server implements Runnable { } } + long ctime = System.currentTimeMillis(); for(int i = clientList.size() - 1; i >= 0; i--) { ServerClient cli = clientList.get(i); if(cli.shouldRemove()) removeClient(cli); + else if(cli.hasTimedOut(ctime)) { + Log.info("Client %s has timed out!", cli.getUUIDString()); + removeClient(cli); + } } } diff --git a/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java index 557e0d7..ced156c 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java @@ -32,6 +32,7 @@ public class ServerClient extends AbstractClient { private long currentFileSize; private long currentFileExpectedSize; private boolean sendingFile; //!= receiving, which is handled by currentFile + private long lastDataTime; ServerClient(SocketChannel s, Selector ss) { socket = s; @@ -40,6 +41,8 @@ public class ServerClient extends AbstractClient { try { selKey = socket.register(selector, SelectionKey.OP_READ); } catch(ClosedChannelException ex) {} + + lastDataTime = System.currentTimeMillis(); } @Override @@ -58,6 +61,10 @@ public class ServerClient extends AbstractClient { return remove; } + public boolean hasTimedOut(long now) { + return now - lastDataTime >= Constants.CLIENT_TIMEOUT; + } + SocketChannel getChannel() { return socket; } @@ -381,4 +388,13 @@ public class ServerClient extends AbstractClient { } + @Override + protected void onDataReceived() { + lastDataTime = System.currentTimeMillis(); + } + + public String getUUIDString() { + return (uuid == null) ? "[NOT IDENTIFIED YET]" : uuid.toString(); + } + } diff --git a/src/main/resources/assets/webdisplays/lang/en_us.lang b/src/main/resources/assets/webdisplays/lang/en_us.lang index d291e9d..9c56488 100644 --- a/src/main/resources/assets/webdisplays/lang/en_us.lang +++ b/src/main/resources/assets/webdisplays/lang/en_us.lang @@ -116,7 +116,7 @@ webdisplays.server.unknowncmd=Unknown command. webdisplays.server.error=Internal error. Check logs. webdisplays.server.error2=Internal error %d. Check logs. webdisplays.server.argerror=Unrecognized argument. -webdisplays.server.queryerr=Query error, check logs. +webdisplays.server.queryerr=Query error, try "reconnect". webdisplays.server.errowner=Only the owner can access this. webdisplays.server.timeout=Query timed out. Check logs. webdisplays.server.ownername=Owner name: %s @@ -140,3 +140,4 @@ webdisplays.server.help.ls=Lists the files on this server webdisplays.server.help.url=Copies a file URL into your clipboard webdisplays.server.help.upload=Opens the upload wizard webdisplays.server.help.rm=Deletes a file +webdisplays.server.help.reconnect=Reconnect to miniserv [DEBUG]