From b5d7493c23d89ab100e1378e3c813d6cff00673a Mon Sep 17 00:00:00 2001 From: LimeGlass Date: Mon, 3 Aug 2020 17:42:36 -0600 Subject: [PATCH 1/8] stuff --- build.gradle | 2 +- .../sitrica/japson/client/JapsonClient.java | 17 ++++++++-------- .../sitrica/japson/server/Connections.java | 12 ++++++++++- .../sitrica/japson/server/JapsonServer.java | 19 +++++++++++++----- .../sitrica/japson/server/SocketHandler.java | 20 +++---------------- .../com/sitrica/japson/shared/Japson.java | 19 +++++++++--------- .../java/com/sitrica/japson/ClientTest.java | 3 +-- .../java/com/sitrica/japson/GeneralTest.java | 2 +- .../java/com/sitrica/japson/ServerTest.java | 1 - 9 files changed, 49 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 0093ce0..49c277d 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2' +version '1.1.2.1-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/client/JapsonClient.java b/src/main/java/com/sitrica/japson/client/JapsonClient.java index c9c1f8f..333f098 100644 --- a/src/main/java/com/sitrica/japson/client/JapsonClient.java +++ b/src/main/java/com/sitrica/japson/client/JapsonClient.java @@ -18,7 +18,7 @@ public class JapsonClient extends Japson { - private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); protected long HEARTBEAT = 1000L, DELAY = 1000L; // in milliseconds. @@ -55,15 +55,14 @@ public JapsonClient(InetAddress address, int port, Gson gson) { HeartbeatPacket packet = new HeartbeatPacket(password, port); executor.scheduleAtFixedRate(() -> { try { - Boolean success = sendPacket(address, port, packet, gson); + Boolean success = sendPacket(packet); if (check && success) valid = true; } catch (TimeoutException | InterruptedException | ExecutionException e) { valid = false; } }, DELAY, HEARTBEAT, TimeUnit.MILLISECONDS); - if (debug) - logger.atInfo().log("Started Japson client bound to %s.", address.getHostAddress() + ":" + port); + logger.atInfo().log("Started Japson client bound to %s.", address.getHostAddress() + ":" + port); } @Override @@ -126,14 +125,14 @@ public void kill() { executor.shutdownNow(); } - public T sendPacket(ReturnablePacket japsonPacket) throws TimeoutException, InterruptedException, ExecutionException { - if (!valid) + public T sendPacket(ReturnablePacket packet) throws TimeoutException, InterruptedException, ExecutionException { + if (check && !valid && !(packet instanceof HeartbeatPacket)) throw new TimeoutException("No connection to the server. Cancelling sending packet."); - return sendPacket(address, port, japsonPacket, gson); + return sendPacket(address, port, packet, gson); } - public void sendPacket(Packet japsonPacket) { - sendPacket(address, port, japsonPacket, gson); + public void sendPacket(Packet packet) throws InterruptedException, ExecutionException { + sendPacket(address, port, packet, gson); } } diff --git a/src/main/java/com/sitrica/japson/server/Connections.java b/src/main/java/com/sitrica/japson/server/Connections.java index 0d79903..00c6889 100644 --- a/src/main/java/com/sitrica/japson/server/Connections.java +++ b/src/main/java/com/sitrica/japson/server/Connections.java @@ -8,6 +8,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; @@ -22,6 +23,7 @@ public class Connections extends Handler { + private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); private final LoadingCache disconnected; private final List connections = new ArrayList<>(); private final Set listeners = new HashSet<>(); @@ -54,7 +56,7 @@ public JapsonConnection load(InetSocketAddress address) throws Exception { } }); listeners.addAll(japson.getListeners()); - Executors.newSingleThreadScheduledExecutor().schedule(() -> { + executor.schedule(() -> { for (JapsonConnection connection : connections) { if (System.currentTimeMillis() - connection.getLastUpdate() < japson.getTimeout()) continue; @@ -120,6 +122,14 @@ public JsonObject handle(InetAddress address, int packetPort, JsonObject json) { return returning; } + public void shutdown() { + executor.shutdown(); + } + + public void kill() { + executor.shutdownNow(); + } + public class JapsonConnection { private long updated = System.currentTimeMillis(); diff --git a/src/main/java/com/sitrica/japson/server/JapsonServer.java b/src/main/java/com/sitrica/japson/server/JapsonServer.java index 2ce527d..7b497bc 100644 --- a/src/main/java/com/sitrica/japson/server/JapsonServer.java +++ b/src/main/java/com/sitrica/japson/server/JapsonServer.java @@ -18,8 +18,7 @@ public class JapsonServer extends Japson { - private static final ExecutorService executor = Executors.newCachedThreadPool(); - private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + private final ExecutorService executor = Executors.newCachedThreadPool(); protected final Set listeners = new HashSet<>(); private final Set ignored = new HashSet<>(); @@ -56,12 +55,12 @@ public JapsonServer(String host, int port, Gson gson) throws UnknownHostExceptio public JapsonServer(InetAddress address, int port, Gson gson) throws SocketException { super(address, port); this.gson = gson; - this.socket = new DatagramSocket(port); + this.socket = new DatagramSocket(port, address); + socket.setSoTimeout(TIMEOUT); connections = new Connections(this); handlers.add(connections); executor.execute(new SocketHandler(PACKET_SIZE, this, socket)); - if (debug) - logger.atInfo().log("Started Japson server bound to %s.", address.getHostAddress() + ":" + port); + logger.atInfo().log("Started Japson server bound to %s.", address.getHostAddress() + ":" + port); } @Override @@ -153,9 +152,19 @@ public long getTimeout() { } public void shutdown() { + connections.shutdown(); + socket.disconnect(); + socket.close(); executor.shutdown(); } + public void kill() { + connections.kill(); + socket.disconnect(); + socket.close(); + executor.shutdownNow(); + } + public Gson getGson() { return gson; } diff --git a/src/main/java/com/sitrica/japson/server/SocketHandler.java b/src/main/java/com/sitrica/japson/server/SocketHandler.java index 47528f4..5ae5d95 100644 --- a/src/main/java/com/sitrica/japson/server/SocketHandler.java +++ b/src/main/java/com/sitrica/japson/server/SocketHandler.java @@ -4,8 +4,6 @@ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataOutput; @@ -16,8 +14,6 @@ public class SocketHandler implements Runnable { - private static final ExecutorService executor = Executors.newSingleThreadExecutor(); - private final DatagramSocket socket; private final JapsonServer japson; private final int packetSize; @@ -30,16 +26,6 @@ public SocketHandler(int packetSize, JapsonServer japson, DatagramSocket socket) this.socket = socket; } - void shutdown() { - executor.shutdown(); - running = false; - } - - void kill() { - executor.shutdownNow(); - running = false; - } - @Override public void run() { while (running) { @@ -56,11 +42,11 @@ public void run() { int id = input.readInt(); String data = input.readUTF(); if (data == null) { - japson.getLogger().atSevere().log("Recieved packet with id %s and the json was null.", id); + japson.getLogger().atSevere().log("Received packet with id %s and the json was null.", id); return; } - if (japson.isDebug() && !japson.getIgnoredPackets().contains(id)) - japson.getLogger().atInfo().log("Recieved packet with id %s and data %s", id, data); + if (japson.isDebug() && (japson.getIgnoredPackets().isEmpty() || !japson.getIgnoredPackets().contains(id))) + japson.getLogger().atInfo().log("Received packet with id %s and data %s", id, data); // Handle JsonObject object = JsonParser.parseString(data).getAsJsonObject(); japson.getHandlers().stream() diff --git a/src/main/java/com/sitrica/japson/shared/Japson.java b/src/main/java/com/sitrica/japson/shared/Japson.java index 437431f..06b979a 100644 --- a/src/main/java/com/sitrica/japson/shared/Japson.java +++ b/src/main/java/com/sitrica/japson/shared/Japson.java @@ -23,7 +23,7 @@ public abstract class Japson { - protected static final FluentLogger logger = FluentLogger.forEnclosingClass(); + protected final FluentLogger logger = FluentLogger.forEnclosingClass(); protected final Set acceptable = new HashSet<>(); protected final Set handlers = new HashSet<>(); @@ -97,8 +97,8 @@ public int getPort() { return port; } - public T sendPacket(InetAddress address, int port, ReturnablePacket japsonPacket) throws TimeoutException, InterruptedException, ExecutionException { - return sendPacket(address, port, japsonPacket, new GsonBuilder() + public T sendPacket(InetAddress address, int port, ReturnablePacket packet) throws TimeoutException, InterruptedException, ExecutionException { + return sendPacket(address, port, packet, new GsonBuilder() .enableComplexMapKeySerialization() .serializeNulls() .setLenient() @@ -112,8 +112,9 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); byte[] buf = out.toByteArray(); - DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port); - socket.send(packet); + socket.setSoTimeout(TIMEOUT); + System.out.println("sending " + japsonPacket.getID()); + socket.send(new DatagramPacket(buf, buf.length, address, port)); // Reset the byte buffer buf = new byte[PACKET_SIZE]; ByteArrayDataInput input = new ReceiverFuture(logger, this, socket) @@ -149,7 +150,7 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso }).get(TIMEOUT, TimeUnit.MILLISECONDS); } - public void sendPacket(InetAddress address, int port, Packet japsonPacket) { + public void sendPacket(InetAddress address, int port, Packet japsonPacket) throws InterruptedException, ExecutionException { sendPacket(address, port, japsonPacket, new GsonBuilder() .enableComplexMapKeySerialization() .serializeNulls() @@ -157,14 +158,14 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket) { .create()); } - public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson gson) { + public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson gson) throws InterruptedException, ExecutionException { CompletableFuture.runAsync(() -> { try (DatagramSocket socket = new DatagramSocket()) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); byte[] buf = out.toByteArray(); - socket.setSoTimeout((int)(3000)); + socket.setSoTimeout(TIMEOUT); socket.send(new DatagramPacket(buf, buf.length, address, port)); if (debug) logger.atInfo().log("Sent non-returnable packet with id %s", japsonPacket.getID()); @@ -177,7 +178,7 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson .atMostEvery(15, TimeUnit.SECONDS) .log("IO error: " + exception.getMessage()); } - }); + }).get(); } } diff --git a/src/test/java/com/sitrica/japson/ClientTest.java b/src/test/java/com/sitrica/japson/ClientTest.java index bd4a6d0..db17d1c 100644 --- a/src/test/java/com/sitrica/japson/ClientTest.java +++ b/src/test/java/com/sitrica/japson/ClientTest.java @@ -14,13 +14,12 @@ public static void setupClient() { try { japson = new JapsonClient(1337) .setPassword("test-password") - .makeSureConnectionValid() + //.makeSureConnectionValid() .enableDebug(); } catch (UnknownHostException e) { e.printStackTrace(); } assertNotNull(japson); - System.out.println("Client setup on " + japson.getAddress().getHostAddress() + ":" + japson.getPort()); } } diff --git a/src/test/java/com/sitrica/japson/GeneralTest.java b/src/test/java/com/sitrica/japson/GeneralTest.java index 10cd566..491de73 100644 --- a/src/test/java/com/sitrica/japson/GeneralTest.java +++ b/src/test/java/com/sitrica/japson/GeneralTest.java @@ -34,6 +34,7 @@ public void startClient() { @Test @Order(3) public void sendPacket() { + assertEquals(ClientTest.japson.getAddress(), ServerTest.japson.getAddress()); String value = "testing Japson", value2 = "testing Japson 2"; String returned = null, second = null; try { @@ -77,7 +78,6 @@ public JsonObject toJson() { assertEquals(returned, value); assertNotNull(second); assertEquals(second, value2); - ClientTest.japson.getLogger().atInfo().log("All tests were successful!"); } } diff --git a/src/test/java/com/sitrica/japson/ServerTest.java b/src/test/java/com/sitrica/japson/ServerTest.java index 60a22ad..3bbeb36 100644 --- a/src/test/java/com/sitrica/japson/ServerTest.java +++ b/src/test/java/com/sitrica/japson/ServerTest.java @@ -60,7 +60,6 @@ public void execute(InetAddress address, int port, JsonObject object) { e.printStackTrace(); } assertNotNull(japson); - System.out.println("Server started on " + japson.getAddress().getHostAddress() + ":" + japson.getPort()); } } From b5d2bae64a1dd45963d0ead46207acd47daf3975 Mon Sep 17 00:00:00 2001 From: LimeGlass Date: Wed, 16 Sep 2020 04:36:46 -0600 Subject: [PATCH 2/8] 1.1.2.2 --- build.gradle | 2 +- src/main/java/com/sitrica/japson/shared/Japson.java | 1 - src/test/java/com/sitrica/japson/ClientTest.java | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 49c277d..b8a6cce 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.1-SNAPSHOT' +version '1.1.2.2-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/shared/Japson.java b/src/main/java/com/sitrica/japson/shared/Japson.java index 06b979a..70a18df 100644 --- a/src/main/java/com/sitrica/japson/shared/Japson.java +++ b/src/main/java/com/sitrica/japson/shared/Japson.java @@ -113,7 +113,6 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso out.writeUTF(gson.toJson(japsonPacket.toJson())); byte[] buf = out.toByteArray(); socket.setSoTimeout(TIMEOUT); - System.out.println("sending " + japsonPacket.getID()); socket.send(new DatagramPacket(buf, buf.length, address, port)); // Reset the byte buffer buf = new byte[PACKET_SIZE]; diff --git a/src/test/java/com/sitrica/japson/ClientTest.java b/src/test/java/com/sitrica/japson/ClientTest.java index db17d1c..0905ace 100644 --- a/src/test/java/com/sitrica/japson/ClientTest.java +++ b/src/test/java/com/sitrica/japson/ClientTest.java @@ -14,7 +14,7 @@ public static void setupClient() { try { japson = new JapsonClient(1337) .setPassword("test-password") - //.makeSureConnectionValid() + .makeSureConnectionValid() .enableDebug(); } catch (UnknownHostException e) { e.printStackTrace(); From dab4a7ba513d53333a12ba0ea0e62867a8c44fae Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 12:36:35 -0600 Subject: [PATCH 3/8] More shutdowns --- build.gradle | 2 +- .../com/sitrica/japson/server/JapsonServer.java | 6 +++++- .../com/sitrica/japson/server/SocketHandler.java | 4 ++++ .../java/com/sitrica/japson/shared/Japson.java | 14 +++++++++----- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index b8a6cce..4aacf53 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.2-SNAPSHOT' +version '1.1.2.3-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/server/JapsonServer.java b/src/main/java/com/sitrica/japson/server/JapsonServer.java index 7b497bc..9861c57 100644 --- a/src/main/java/com/sitrica/japson/server/JapsonServer.java +++ b/src/main/java/com/sitrica/japson/server/JapsonServer.java @@ -21,6 +21,7 @@ public class JapsonServer extends Japson { private final ExecutorService executor = Executors.newCachedThreadPool(); protected final Set listeners = new HashSet<>(); private final Set ignored = new HashSet<>(); + private final SocketHandler handler; private long RECONNECT = 5, EXPIRY = 10; // EXPIRY in minutes, DISCONNECT is amount. private final Connections connections; @@ -59,7 +60,8 @@ public JapsonServer(InetAddress address, int port, Gson gson) throws SocketExcep socket.setSoTimeout(TIMEOUT); connections = new Connections(this); handlers.add(connections); - executor.execute(new SocketHandler(PACKET_SIZE, this, socket)); + handler = new SocketHandler(PACKET_SIZE, this, socket); + executor.execute(handler); logger.atInfo().log("Started Japson server bound to %s.", address.getHostAddress() + ":" + port); } @@ -155,6 +157,7 @@ public void shutdown() { connections.shutdown(); socket.disconnect(); socket.close(); + handler.stop(); executor.shutdown(); } @@ -162,6 +165,7 @@ public void kill() { connections.kill(); socket.disconnect(); socket.close(); + handler.stop(); executor.shutdownNow(); } diff --git a/src/main/java/com/sitrica/japson/server/SocketHandler.java b/src/main/java/com/sitrica/japson/server/SocketHandler.java index 5ae5d95..803215c 100644 --- a/src/main/java/com/sitrica/japson/server/SocketHandler.java +++ b/src/main/java/com/sitrica/japson/server/SocketHandler.java @@ -74,4 +74,8 @@ public void run() { } } + public void stop() { + running = false; + } + } diff --git a/src/main/java/com/sitrica/japson/shared/Japson.java b/src/main/java/com/sitrica/japson/shared/Japson.java index 70a18df..7e48265 100644 --- a/src/main/java/com/sitrica/japson/shared/Japson.java +++ b/src/main/java/com/sitrica/japson/shared/Japson.java @@ -107,7 +107,8 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket packe public T sendPacket(InetAddress address, int port, ReturnablePacket japsonPacket, Gson gson) throws TimeoutException, InterruptedException, ExecutionException { return CompletableFuture.supplyAsync(() -> { - try (DatagramSocket socket = new DatagramSocket()) { + try { + DatagramSocket socket = new DatagramSocket(); ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); @@ -119,6 +120,7 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso ByteArrayDataInput input = new ReceiverFuture(logger, this, socket) .create(new DatagramPacket(buf, buf.length)) .get(); + socket.close(); if (input == null) { logger.atSevere().log("Packet with id %s returned null or an incorrect readable object for Japson", japsonPacket.getID()); return null; @@ -149,7 +151,7 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso }).get(TIMEOUT, TimeUnit.MILLISECONDS); } - public void sendPacket(InetAddress address, int port, Packet japsonPacket) throws InterruptedException, ExecutionException { + public void sendPacket(InetAddress address, int port, Packet japsonPacket) throws InterruptedException, ExecutionException, TimeoutException { sendPacket(address, port, japsonPacket, new GsonBuilder() .enableComplexMapKeySerialization() .serializeNulls() @@ -157,9 +159,10 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket) throw .create()); } - public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson gson) throws InterruptedException, ExecutionException { + public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson gson) throws InterruptedException, ExecutionException, TimeoutException { CompletableFuture.runAsync(() -> { - try (DatagramSocket socket = new DatagramSocket()) { + try { + DatagramSocket socket = new DatagramSocket(); ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); @@ -168,6 +171,7 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson socket.send(new DatagramPacket(buf, buf.length, address, port)); if (debug) logger.atInfo().log("Sent non-returnable packet with id %s", japsonPacket.getID()); + socket.close(); } catch (SocketException socketException) { logger.atSevere().withCause(socketException) .atMostEvery(15, TimeUnit.SECONDS) @@ -177,7 +181,7 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson .atMostEvery(15, TimeUnit.SECONDS) .log("IO error: " + exception.getMessage()); } - }).get(); + }).get(TIMEOUT, TimeUnit.MILLISECONDS); } } From dafa0841d0ab373aee2831b41edc1774947abecd Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 12:37:36 -0600 Subject: [PATCH 4/8] More shutdowns --- src/main/java/com/sitrica/japson/client/JapsonClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sitrica/japson/client/JapsonClient.java b/src/main/java/com/sitrica/japson/client/JapsonClient.java index 333f098..67e6769 100644 --- a/src/main/java/com/sitrica/japson/client/JapsonClient.java +++ b/src/main/java/com/sitrica/japson/client/JapsonClient.java @@ -131,7 +131,7 @@ public T sendPacket(ReturnablePacket packet) throws TimeoutException, Int return sendPacket(address, port, packet, gson); } - public void sendPacket(Packet packet) throws InterruptedException, ExecutionException { + public void sendPacket(Packet packet) throws InterruptedException, ExecutionException, TimeoutException { sendPacket(address, port, packet, gson); } From fc34727fc859b62928cfdd9ae11ed3443b0c8aef Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 12:49:54 -0600 Subject: [PATCH 5/8] More shutdowns --- build.gradle | 2 +- src/main/java/com/sitrica/japson/client/JapsonClient.java | 1 + src/test/java/com/sitrica/japson/GeneralTest.java | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4aacf53..5f90784 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.3-SNAPSHOT' +version '1.1.2.4-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/client/JapsonClient.java b/src/main/java/com/sitrica/japson/client/JapsonClient.java index 67e6769..7d7459e 100644 --- a/src/main/java/com/sitrica/japson/client/JapsonClient.java +++ b/src/main/java/com/sitrica/japson/client/JapsonClient.java @@ -60,6 +60,7 @@ public JapsonClient(InetAddress address, int port, Gson gson) { valid = true; } catch (TimeoutException | InterruptedException | ExecutionException e) { valid = false; + e.printStackTrace(); } }, DELAY, HEARTBEAT, TimeUnit.MILLISECONDS); logger.atInfo().log("Started Japson client bound to %s.", address.getHostAddress() + ":" + port); diff --git a/src/test/java/com/sitrica/japson/GeneralTest.java b/src/test/java/com/sitrica/japson/GeneralTest.java index 491de73..feb0380 100644 --- a/src/test/java/com/sitrica/japson/GeneralTest.java +++ b/src/test/java/com/sitrica/japson/GeneralTest.java @@ -78,6 +78,7 @@ public JsonObject toJson() { assertEquals(returned, value); assertNotNull(second); assertEquals(second, value2); + ServerTest.japson.shutdown(); } } From a21e5f68f6d843badae3006bdbc2dec0e22e7f65 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 13:06:04 -0600 Subject: [PATCH 6/8] Proper structure --- build.gradle | 2 +- .../sitrica/japson/client/JapsonClient.java | 28 ++++++++++++++----- .../sitrica/japson/server/JapsonServer.java | 14 +++++++++- .../com/sitrica/japson/shared/Japson.java | 16 ----------- .../java/com/sitrica/japson/ClientTest.java | 3 +- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 5f90784..e06fe2b 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.4-SNAPSHOT' +version '1.1.2.5-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/client/JapsonClient.java b/src/main/java/com/sitrica/japson/client/JapsonClient.java index 7d7459e..daa64ba 100644 --- a/src/main/java/com/sitrica/japson/client/JapsonClient.java +++ b/src/main/java/com/sitrica/japson/client/JapsonClient.java @@ -22,6 +22,9 @@ public class JapsonClient extends Japson { protected long HEARTBEAT = 1000L, DELAY = 1000L; // in milliseconds. + protected final InetAddress address; + protected final int port; + private boolean check, valid = true; private final Gson gson; @@ -50,20 +53,23 @@ public JapsonClient(String host, int port, Gson gson) throws UnknownHostExceptio } public JapsonClient(InetAddress address, int port, Gson gson) { - super(address, port); + this.address = address; + this.port = port; this.gson = gson; - HeartbeatPacket packet = new HeartbeatPacket(password, port); + } + + public JapsonClient start() { executor.scheduleAtFixedRate(() -> { try { - Boolean success = sendPacket(packet); - if (check && success) + Boolean success = sendPacket(new HeartbeatPacket(password, port)); + if (check && success != null && success) valid = true; } catch (TimeoutException | InterruptedException | ExecutionException e) { valid = false; - e.printStackTrace(); } }, DELAY, HEARTBEAT, TimeUnit.MILLISECONDS); logger.atInfo().log("Started Japson client bound to %s.", address.getHostAddress() + ":" + port); + return this; } @Override @@ -118,6 +124,14 @@ public JapsonClient enableDebug() { return this; } + public InetAddress getAddress() { + return address; + } + + public int getPort() { + return port; + } + public void shutdown() { executor.shutdown(); } @@ -129,11 +143,11 @@ public void kill() { public T sendPacket(ReturnablePacket packet) throws TimeoutException, InterruptedException, ExecutionException { if (check && !valid && !(packet instanceof HeartbeatPacket)) throw new TimeoutException("No connection to the server. Cancelling sending packet."); - return sendPacket(address, port, packet, gson); + return super.sendPacket(address, port, packet, gson); } public void sendPacket(Packet packet) throws InterruptedException, ExecutionException, TimeoutException { - sendPacket(address, port, packet, gson); + super.sendPacket(address, port, packet, gson); } } diff --git a/src/main/java/com/sitrica/japson/server/JapsonServer.java b/src/main/java/com/sitrica/japson/server/JapsonServer.java index 9861c57..c081612 100644 --- a/src/main/java/com/sitrica/japson/server/JapsonServer.java +++ b/src/main/java/com/sitrica/japson/server/JapsonServer.java @@ -23,6 +23,9 @@ public class JapsonServer extends Japson { private final Set ignored = new HashSet<>(); private final SocketHandler handler; + protected final InetAddress address; + protected final int port; + private long RECONNECT = 5, EXPIRY = 10; // EXPIRY in minutes, DISCONNECT is amount. private final Connections connections; private final DatagramSocket socket; @@ -54,7 +57,8 @@ public JapsonServer(String host, int port, Gson gson) throws UnknownHostExceptio } public JapsonServer(InetAddress address, int port, Gson gson) throws SocketException { - super(address, port); + this.address = address; + this.port = port; this.gson = gson; this.socket = new DatagramSocket(port, address); socket.setSoTimeout(TIMEOUT); @@ -149,6 +153,14 @@ public FluentLogger getLogger() { return logger; } + public InetAddress getAddress() { + return address; + } + + public int getPort() { + return port; + } + public long getTimeout() { return TIMEOUT; } diff --git a/src/main/java/com/sitrica/japson/shared/Japson.java b/src/main/java/com/sitrica/japson/shared/Japson.java index 7e48265..ccc517b 100644 --- a/src/main/java/com/sitrica/japson/shared/Japson.java +++ b/src/main/java/com/sitrica/japson/shared/Japson.java @@ -27,19 +27,11 @@ public abstract class Japson { protected final Set acceptable = new HashSet<>(); protected final Set handlers = new HashSet<>(); - protected final InetAddress address; - protected final int port; - protected int PACKET_SIZE = 1024; // UDP standard protected int TIMEOUT = 2000; // milliseconds protected String password; protected boolean debug; - protected Japson(InetAddress address, int port) { - this.address = address; - this.port = port; - } - public Japson registerHandlers(Handler... handlers) { Sets.newHashSet(handlers).stream() .filter(handler -> !this.handlers.stream().anyMatch(existing -> existing.getID() == handler.getID())) @@ -81,10 +73,6 @@ public FluentLogger getLogger() { return logger; } - public InetAddress getAddress() { - return address; - } - public boolean hasPassword() { return password != null; } @@ -93,10 +81,6 @@ public boolean isDebug() { return debug; } - public int getPort() { - return port; - } - public T sendPacket(InetAddress address, int port, ReturnablePacket packet) throws TimeoutException, InterruptedException, ExecutionException { return sendPacket(address, port, packet, new GsonBuilder() .enableComplexMapKeySerialization() diff --git a/src/test/java/com/sitrica/japson/ClientTest.java b/src/test/java/com/sitrica/japson/ClientTest.java index 0905ace..b40aaae 100644 --- a/src/test/java/com/sitrica/japson/ClientTest.java +++ b/src/test/java/com/sitrica/japson/ClientTest.java @@ -15,7 +15,8 @@ public static void setupClient() { japson = new JapsonClient(1337) .setPassword("test-password") .makeSureConnectionValid() - .enableDebug(); + .enableDebug() + .start(); } catch (UnknownHostException e) { e.printStackTrace(); } From 24dfe88a83db6c1350876ed21d0d18f81487a7fb Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 13:35:49 -0600 Subject: [PATCH 7/8] Everything working again --- build.gradle | 2 +- .../com/sitrica/japson/server/SocketHandler.java | 4 ++++ .../java/com/sitrica/japson/shared/Japson.java | 14 +++++--------- .../com/sitrica/japson/shared/ReceiverFuture.java | 2 ++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index e06fe2b..7182671 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.5-SNAPSHOT' +version '1.1.2.8-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/src/main/java/com/sitrica/japson/server/SocketHandler.java b/src/main/java/com/sitrica/japson/server/SocketHandler.java index 803215c..3a8e7bb 100644 --- a/src/main/java/com/sitrica/japson/server/SocketHandler.java +++ b/src/main/java/com/sitrica/japson/server/SocketHandler.java @@ -29,6 +29,8 @@ public SocketHandler(int packetSize, JapsonServer japson, DatagramSocket socket) @Override public void run() { while (running) { + if (socket.isClosed()) + break; try { byte[] buf = new byte[packetSize]; DatagramPacket packet = new DatagramPacket(buf, buf.length); @@ -61,6 +63,8 @@ public void run() { out.writeUTF(json); byte[] returnBuf = out.toByteArray(); try { + if (socket.isClosed()) + return; socket.send(new DatagramPacket(returnBuf, returnBuf.length, packet.getAddress(), packet.getPort())); if (japson.isDebug()) japson.getLogger().atInfo().log("Returning data %s as packet id %s", json, id); diff --git a/src/main/java/com/sitrica/japson/shared/Japson.java b/src/main/java/com/sitrica/japson/shared/Japson.java index ccc517b..ea47ff2 100644 --- a/src/main/java/com/sitrica/japson/shared/Japson.java +++ b/src/main/java/com/sitrica/japson/shared/Japson.java @@ -91,8 +91,7 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket packe public T sendPacket(InetAddress address, int port, ReturnablePacket japsonPacket, Gson gson) throws TimeoutException, InterruptedException, ExecutionException { return CompletableFuture.supplyAsync(() -> { - try { - DatagramSocket socket = new DatagramSocket(); + try (DatagramSocket socket = new DatagramSocket()) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); @@ -103,7 +102,7 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso buf = new byte[PACKET_SIZE]; ByteArrayDataInput input = new ReceiverFuture(logger, this, socket) .create(new DatagramPacket(buf, buf.length)) - .get(); + .get(TIMEOUT, TimeUnit.MILLISECONDS); socket.close(); if (input == null) { logger.atSevere().log("Packet with id %s returned null or an incorrect readable object for Japson", japsonPacket.getID()); @@ -126,10 +125,8 @@ public T sendPacket(InetAddress address, int port, ReturnablePacket japso logger.atSevere().withCause(exception) .atMostEvery(15, TimeUnit.SECONDS) .log("IO error: " + exception.getMessage()); - } catch (InterruptedException | ExecutionException exception) { - logger.atSevere().withCause(exception) - .atMostEvery(15, TimeUnit.SECONDS) - .log("Timeout: " + exception.getMessage()); + } catch (InterruptedException | ExecutionException | TimeoutException exception) { + // Already handled seperate. } return null; }).get(TIMEOUT, TimeUnit.MILLISECONDS); @@ -145,8 +142,7 @@ public void sendPacket(InetAddress address, int port, Packet japsonPacket) throw public void sendPacket(InetAddress address, int port, Packet japsonPacket, Gson gson) throws InterruptedException, ExecutionException, TimeoutException { CompletableFuture.runAsync(() -> { - try { - DatagramSocket socket = new DatagramSocket(); + try (DatagramSocket socket = new DatagramSocket()) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(japsonPacket.getID()); out.writeUTF(gson.toJson(japsonPacket.toJson())); diff --git a/src/main/java/com/sitrica/japson/shared/ReceiverFuture.java b/src/main/java/com/sitrica/japson/shared/ReceiverFuture.java index aadf35c..c40deb5 100644 --- a/src/main/java/com/sitrica/japson/shared/ReceiverFuture.java +++ b/src/main/java/com/sitrica/japson/shared/ReceiverFuture.java @@ -25,6 +25,8 @@ public ReceiverFuture(FluentLogger logger, Japson japson, DatagramSocket socket) public CompletableFuture create(DatagramPacket packet) { return CompletableFuture.supplyAsync(() -> { while (true) { + if (socket.isClosed()) + return null; try { socket.receive(packet); byte[] data = packet.getData(); From 4503fef837d4f7e7fddecb079b1468abef15c61f Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 23 Sep 2020 13:41:27 -0600 Subject: [PATCH 8/8] 1.1.3 --- build.gradle | 2 +- src/test/java/com/sitrica/japson/GeneralTest.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 7182671..a22db67 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jar.archiveName = project.name + '.jar' // Add SNAPSHOT to make this publish as a beta. -version '1.1.2.8-SNAPSHOT' +version '1.1.3' sourceCompatibility = 1.8 diff --git a/src/test/java/com/sitrica/japson/GeneralTest.java b/src/test/java/com/sitrica/japson/GeneralTest.java index feb0380..491de73 100644 --- a/src/test/java/com/sitrica/japson/GeneralTest.java +++ b/src/test/java/com/sitrica/japson/GeneralTest.java @@ -78,7 +78,6 @@ public JsonObject toJson() { assertEquals(returned, value); assertNotNull(second); assertEquals(second, value2); - ServerTest.japson.shutdown(); } }