diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/NetworkPipeline.java b/src/main/java/me/finn/unlegitlibrary/network/system/NetworkPipeline.java new file mode 100644 index 0000000..2860292 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/NetworkPipeline.java @@ -0,0 +1,17 @@ +package me.finn.unlegitlibrary.network.system; + +import me.finn.unlegitlibrary.event.EventManager; +import me.finn.unlegitlibrary.network.system.packets.PacketHandler; +import me.finn.unlegitlibrary.utils.DefaultMethodsOverrider; + +public abstract class NetworkPipeline extends DefaultMethodsOverrider { + + public int port = 3982; + public PacketHandler packetHandler = new PacketHandler(); + public EventManager eventManager = new EventManager(); + public boolean logDebug = false; + public int maxAttempts = 10; // -1 = Endless | 0 = Disabled + public int attemptDelayInSeconds = 5; + + public abstract void implement(); +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java index 3c731ac..e1487f5 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java @@ -9,6 +9,7 @@ package me.finn.unlegitlibrary.network.system.client; import me.finn.unlegitlibrary.event.EventManager; +import me.finn.unlegitlibrary.network.system.NetworkPipeline; import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_PacketFailedReceivedEvent; import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_PacketReceivedEvent; import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_UnknownObjectReceivedEvent; @@ -29,15 +30,33 @@ import java.net.Socket; import java.net.SocketException; public class NetworkClient extends DefaultMethodsOverrider { + public class ClientPipeline extends NetworkPipeline { + public final NetworkClient networkClient; + public String host; - private final String host; - private final int port; - private final PacketHandler packetHandler; - private final EventManager eventManager; - private final boolean autoReconnect; - private final boolean debugLog; - private final int maxAttempts; - private final int attemptDelayInSec; + public ClientPipeline(NetworkClient networkClient) { + this.networkClient = networkClient; + } + + @Override + public void implement() { + networkClient.host = host; + networkClient.port = port; + networkClient.packetHandler = packetHandler; + networkClient.eventManager = eventManager; + networkClient.maxAttempts = maxAttempts; + networkClient.attemptDelayInSec = attemptDelayInSeconds; + networkClient.debugLog = debugLog; + } + } + + private String host; + private int port; + private PacketHandler packetHandler; + private EventManager eventManager; + private boolean debugLog; + private int maxAttempts; + private int attemptDelayInSec; private Socket socket; private ObjectOutputStream objectOutputStream; @@ -46,19 +65,7 @@ public class NetworkClient extends DefaultMethodsOverrider { private int attempt = 1; private boolean needClientID = false; private final Thread receiveThread = new Thread(this::receive); - private NetworkClient(String host, int port, PacketHandler packetHandler, EventManager eventManager, boolean autoReconnect, boolean debugLog, int maxAttempts, int attemptDelayInSec) { - this.host = host; - this.port = port; - - this.packetHandler = packetHandler; - this.eventManager = eventManager; - - this.autoReconnect = autoReconnect; - this.debugLog = debugLog; - - this.maxAttempts = maxAttempts; - this.attemptDelayInSec = attemptDelayInSec; - + private NetworkClient() { attempt = 1; } @@ -83,7 +90,7 @@ public class NetworkClient extends DefaultMethodsOverrider { } public final boolean isAutoReconnectEnabled() { - return autoReconnect; + return maxAttempts != 0; } public final PacketHandler getPacketHandler() { @@ -132,7 +139,7 @@ public class NetworkClient extends DefaultMethodsOverrider { attempt = 1; if (debugLog) System.out.println("Connected to Server. Attempts: " + attempt); } catch (SocketException exception) { - if (autoReconnect) reconnect(); + if (isAutoReconnectEnabled()) reconnect(); else throw exception; } } @@ -233,8 +240,14 @@ public class NetworkClient extends DefaultMethodsOverrider { } } catch (EOFException exception) { attempt = 1; - if (autoReconnect && maxAttempts == -1 || attempt <= maxAttempts) reconnect(); - else { + if (isAutoReconnectEnabled()) { + if (maxAttempts == -1) reconnect(); + else if (attempt <= maxAttempts) reconnect(); + else { + eventManager.executeEvent(new C_StoppedEvent(this)); + exception.printStackTrace(); + } + } else { eventManager.executeEvent(new C_StoppedEvent(this)); exception.printStackTrace(); } @@ -245,7 +258,7 @@ public class NetworkClient extends DefaultMethodsOverrider { } private final void reconnect() { - if (autoReconnect) { + if (isAutoReconnectEnabled()) { if (isConnected()) { try { disconnect(); @@ -263,7 +276,8 @@ public class NetworkClient extends DefaultMethodsOverrider { Thread.sleep(attemptDelayInSec * 1000L); connect(); } catch (InterruptedException | IOException exception) { - if (maxAttempts == -1 || attempt <= maxAttempts) reconnect(); + if (maxAttempts == -1) reconnect(); + else if (attempt <= maxAttempts) reconnect(); else exception.printStackTrace(); } } else { @@ -276,21 +290,15 @@ public class NetworkClient extends DefaultMethodsOverrider { } } - public static class ClientBuilder { + public class ClientBuilder { private int port; private String host; private PacketHandler packetHandler = new PacketHandler(); private EventManager eventManager = new EventManager(); - private boolean autoReconnect = false; private boolean debugLog = false; - private int maxAttempts = 10; + private int maxAttempts = 0; private int attemptDelayInSec = 1; - public final ClientBuilder enableAutoReconnect() { - this.autoReconnect = true; - return this; - } - public final ClientBuilder enableDebugLog() { this.debugLog = true; return this; @@ -327,11 +335,21 @@ public class NetworkClient extends DefaultMethodsOverrider { } public final NetworkClient build() { - return new NetworkClient(host, port, packetHandler, eventManager, autoReconnect, debugLog, maxAttempts, attemptDelayInSec); + ClientPipeline pipeline = new ClientPipeline(new NetworkClient()); + + pipeline.host = host; + pipeline.port = port; + + pipeline.packetHandler = packetHandler; + pipeline.eventManager = eventManager; + + pipeline.maxAttempts = maxAttempts; + + pipeline.logDebug = debugLog; + pipeline.attemptDelayInSeconds = attemptDelayInSec; + + pipeline.implement(); + return pipeline.networkClient; } } - - - - } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java index 8706935..65e0311 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java @@ -9,6 +9,7 @@ package me.finn.unlegitlibrary.network.system.server; import me.finn.unlegitlibrary.event.EventManager; +import me.finn.unlegitlibrary.network.system.NetworkPipeline; import me.finn.unlegitlibrary.network.system.packets.Packet; import me.finn.unlegitlibrary.network.system.packets.PacketHandler; import me.finn.unlegitlibrary.network.system.server.events.server.S_StartedEvent; @@ -23,28 +24,37 @@ import java.util.List; public class NetworkServer { - private final int port; - private final PacketHandler packetHandler; - private final EventManager eventManager; - private final boolean autoRestart; - private final boolean debugLog; - private final int maxAttempts; - private final int attemptDelayInSec; + public class ServerPipeline extends NetworkPipeline { + + public final NetworkServer networkServer; + + public ServerPipeline(NetworkServer networkServer) { + this.networkServer = networkServer; + } + + @Override + public void implement() { + networkServer.port = port; + networkServer.debugLog = debugLog; + + networkServer.packetHandler = packetHandler; + networkServer.eventManager = eventManager; + + networkServer.maxAttempts = maxAttempts; + networkServer.attemptDelayInSec = attemptDelayInSec; + } + } + private int port; + private PacketHandler packetHandler; + private EventManager eventManager; + private boolean debugLog; + private int maxAttempts; + private int attemptDelayInSec; private final List clientHandlers = new ArrayList<>(); private ServerSocket serverSocket; private int attempt = 1; - private NetworkServer(int port, PacketHandler packetHandler, EventManager eventManager, boolean autoRestart, boolean debugLog, int maxAttempts, int attemptDelayInSec) { - this.port = port; - - this.packetHandler = packetHandler; - this.eventManager = eventManager; - - this.autoRestart = autoRestart; - this.debugLog = debugLog; - - this.maxAttempts = maxAttempts; - this.attemptDelayInSec = attemptDelayInSec; + private NetworkServer() { } private final Thread incomingConnectionThread = new Thread(this::incomingConnection); public final int getPort() { @@ -56,7 +66,7 @@ public class NetworkServer { } public final boolean isAutoRestart() { - return autoRestart; + return maxAttempts != 0; } public final boolean isDebugLogEnabled() { @@ -95,8 +105,8 @@ public class NetworkServer { if (debugLog) System.out.println("Server started on port " + port + ". Attempts: " + attempt); } catch (BindException exception) { - if (autoRestart) { - if (attempt > maxAttempts) throw exception; + if (isAutoRestart()) { + if (attempt > maxAttempts && maxAttempts != -1) throw exception; if (debugLog) System.out.println("Failed to start! Retrying... (Attempt: " + attempt++ + ")"); Thread.sleep(attemptDelayInSec * 1000L); @@ -158,20 +168,14 @@ public class NetworkServer { return eventManager; } - public static class ServerBuilder { + public class ServerBuilder { private int port; - private boolean autoRestart = false; private boolean debugLog = false; private PacketHandler packetHandler = new PacketHandler(); private EventManager eventManager = new EventManager(); - private int maxAttempts = 10; + private int maxAttempts = 0; private int attemptDelayInSec = 1; - public final ServerBuilder enableAutoRestart() { - this.autoRestart = true; - return this; - } - public final ServerBuilder enableDebugLog() { this.debugLog = true; return this; @@ -203,11 +207,20 @@ public class NetworkServer { } public final NetworkServer build() { - return new NetworkServer(port, packetHandler, eventManager, autoRestart, debugLog, maxAttempts, attemptDelayInSec); + ServerPipeline pipeline = new ServerPipeline(new NetworkServer()); + + pipeline.port = port; + + pipeline.packetHandler = packetHandler; + pipeline.eventManager = eventManager; + + pipeline.maxAttempts = maxAttempts; + + pipeline.logDebug = debugLog; + pipeline.attemptDelayInSeconds = attemptDelayInSec; + + pipeline.implement(); + return pipeline.networkServer; } } - - - - }