diff --git a/src/main/java/earth/krakatao/KraSocketClient.java b/src/main/java/earth/krakatao/KraSocketClient.java index 2cc20f3..9dc5559 100644 --- a/src/main/java/earth/krakatao/KraSocketClient.java +++ b/src/main/java/earth/krakatao/KraSocketClient.java @@ -3,10 +3,9 @@ package earth.krakatao; import earth.krakatao.events.KraSocketClientEventInitiater; import earth.krakatao.events.KraSocketClientEventInterface; import earth.krakatao.protocol.KraSocketClientProtocol; -import earth.krakatao.protocol.KraSocketClientProtocolMessage; import java.net.URI; import java.net.URISyntaxException; -import java.util.function.Consumer; +import java.util.List; import java.util.logging.Logger; import lombok.Getter; @@ -22,7 +21,8 @@ public class KraSocketClient { public KraSocketClient(KraSocketClientConfig kraSocketClientConfig, KraSocketClientEventInterface kraSocketClientEventInterface, - KraSocketClientProtocol kraSocketClientProtocol) throws URISyntaxException { + KraSocketClientProtocol kraSocketClientProtocol, List webSocketAckTimeouts) + throws URISyntaxException { this.kraSocketClientConfig = kraSocketClientConfig; this.kraSocketClientEventInitiater = new KraSocketClientEventInitiater(); @@ -33,6 +33,6 @@ public class KraSocketClient { + this.kraSocketClientConfig.getWebSocketPort() + "/ws?ak=" + this.kraSocketClientConfig.getWebSocketAccessKey() + "&s=" + this.kraSocketClientConfig.getWebSocketServerName()), - this.kraSocketClientEventInitiater, kraSocketClientProtocol); + this.kraSocketClientEventInitiater, kraSocketClientProtocol, webSocketAckTimeouts); } } \ No newline at end of file diff --git a/src/main/java/earth/krakatao/KraSocketClientConfig.java b/src/main/java/earth/krakatao/KraSocketClientConfig.java index e54ada2..c5270d4 100644 --- a/src/main/java/earth/krakatao/KraSocketClientConfig.java +++ b/src/main/java/earth/krakatao/KraSocketClientConfig.java @@ -1,14 +1,16 @@ package earth.krakatao; +import java.util.List; import lombok.Data; @Data public class KraSocketClientConfig { - private final String WebSocketProtocol; - private final String WebSocketHost; - private final int WebSocketPort; - private final String WebSocketAccessKey; - private final String WebSocketServerName; + private final String webSocketProtocol; + private final String webSocketHost; + private final int webSocketPort; + private final String webSocketAccessKey; + private final String webSocketServerName; + private final List webSocketAckTimeouts; } diff --git a/src/main/java/earth/krakatao/KraSocketClientMessageTimerTask.java b/src/main/java/earth/krakatao/KraSocketClientMessageTimerTask.java index ffead19..0764e05 100644 --- a/src/main/java/earth/krakatao/KraSocketClientMessageTimerTask.java +++ b/src/main/java/earth/krakatao/KraSocketClientMessageTimerTask.java @@ -2,7 +2,6 @@ package earth.krakatao; import earth.krakatao.protocol.KraSocketClientProtocolMessage; import java.util.TimerTask; -import java.util.function.Consumer; public class KraSocketClientMessageTimerTask extends TimerTask { @@ -15,13 +14,28 @@ public class KraSocketClientMessageTimerTask extends TimerTask { @Override public void run() { KraSocketClient.getLogger().info( - "MessageTimerTask is running " + this.socketClient.getKraProtocol().getConsumerHashMap() + "MessageTimerTask is running. SendQueueMessages size: " + this.socketClient.getKraProtocol() + .getSendQueueMessages() .size()); - for (Consumer consumer : this.socketClient.getKraProtocol() - .getConsumerHashMap().values()) { + long currentTimeMillis = System.currentTimeMillis(); - KraSocketClient.getLogger().info("consumer: " + consumer); + for (KraSocketClientProtocolMessage msg : this.socketClient.getKraProtocol() + .getSendQueueMessages() + .values()) { + if ((currentTimeMillis - msg.getTime()) + > this.socketClient.getWebSocketAckTimeouts() + .get(msg.getTrySendCount())) { + KraSocketClient.getLogger().info("MessageTimerTask here"); + + msg.setTime(currentTimeMillis); + + this.socketClient.SendMessage(msg); + + if (msg.getTrySendCount() < 4) { + msg.setTrySendCount(msg.getTrySendCount() + 1); + } + } } } } diff --git a/src/main/java/earth/krakatao/SocketClient.java b/src/main/java/earth/krakatao/SocketClient.java index 38f2893..52360ee 100644 --- a/src/main/java/earth/krakatao/SocketClient.java +++ b/src/main/java/earth/krakatao/SocketClient.java @@ -6,6 +6,7 @@ import earth.krakatao.protocol.KraSocketClientProtocolMessage; import earth.krakatao.protocol.KraSocketClientProtocolStatus; import java.net.URI; import java.nio.ByteBuffer; +import java.util.List; import java.util.Timer; import java.util.TimerTask; import lombok.Getter; @@ -14,18 +15,20 @@ import org.java_websocket.handshake.ServerHandshake; public class SocketClient extends WebSocketClient { + private final KraSocketClientEventInitiater kraSocketClientEventInitiater; @Getter private final KraSocketClientProtocol kraProtocol; - private final KraSocketClientEventInitiater kraSocketClientEventInitiater; - private TimerTask timerTask; + @Getter + private final List webSocketAckTimeouts; private Timer timer; public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater, - KraSocketClientProtocol kraProtocol) { + KraSocketClientProtocol kraProtocol, List webSocketAckTimeouts) { super(serverUri); this.kraSocketClientEventInitiater = kraSocketClientEventInitiater; this.kraProtocol = kraProtocol; + this.webSocketAckTimeouts = webSocketAckTimeouts; } public void SendMessage(KraSocketClientProtocolMessage kraProtocolMessage) { @@ -44,7 +47,7 @@ public class SocketClient extends WebSocketClient { this.kraSocketClientEventInitiater.callOnOpen(serverHandshake); KraSocketClient.getLogger().info("connection opened"); - this.timerTask = new KraSocketClientMessageTimerTask(this); + TimerTask timerTask = new KraSocketClientMessageTimerTask(this); this.timer = new Timer(true); this.timer.scheduleAtFixedRate(timerTask, 0, 3 * 1000); } @@ -71,13 +74,13 @@ public class SocketClient extends WebSocketClient { // response to the user that this message cmdID is already in the queue if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus() - && this.kraProtocol.getCmdIDs().contains(kraProtocolMessage.getCmdID())) { + && this.kraProtocol.getSendQueueMessages().containsKey(kraProtocolMessage.getCmdID())) { // TODO: uuid kraProtocolMessage = new KraSocketClientProtocolMessage( KraSocketClientProtocolStatus.MESSAGE_ALREADY_IN_QUEUE.getStatus(), kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus() ? kraProtocolMessage.getStatus() : 0, 0, - "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", (short) kraProtocolMessage.getCmdNumber(), ""); + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", (short) kraProtocolMessage.getCmdNumber(), "", null); KraSocketClient.getLogger() .info("response MESSAGE_ALREADY_IN_QUEUE " + kraProtocolMessage.getCmdID()); diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java index 7a3c453..c86ae28 100644 --- a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java @@ -10,18 +10,22 @@ import java.util.function.Consumer; import lombok.Getter; public class KraSocketClientProtocol { - - @Getter - private final ArrayList cmdIDs; + + //@Getter + //private final ArrayList cmdIDs; @Getter private int currentCmdIDIndex; + //@Getter + //private final HashMap> consumerHashMap; + @Getter - private final HashMap> consumerHashMap; + private final HashMap sendQueueMessages; public KraSocketClientProtocol() { - this.cmdIDs = new ArrayList<>(); + //this.cmdIDs = new ArrayList<>(); this.currentCmdIDIndex = 9; - this.consumerHashMap = new HashMap<>(); + //this.consumerHashMap = new HashMap<>(); + this.sendQueueMessages = new HashMap<>(); } public int generateCmdID() { @@ -79,7 +83,7 @@ public class KraSocketClientProtocol { } } - this.cmdIDs.add(cmdID); + //this.cmdIDs.add(cmdID); return raw; } @@ -125,10 +129,11 @@ public class KraSocketClientProtocol { + cmdNumber + " " + args + " "); return new KraSocketClientProtocolMessage(status, cmdID, dest, - Formatter.stringToUuid(playerUuid).toString(), cmdNumber, args); + Formatter.stringToUuid(playerUuid).toString(), cmdNumber, args, null); } public void removeData(int cmdID) { + /* Iterator iterator = this.cmdIDs.iterator(); KraSocketClient.getLogger().info("before: " + this.cmdIDs); @@ -140,6 +145,6 @@ public class KraSocketClientProtocol { } KraSocketClient.getLogger().info("after: " + this.cmdIDs); - this.consumerHashMap.remove(cmdID); + this.consumerHashMap.remove(cmdID); */ } } diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java index 2cbbcad..76f3980 100644 --- a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java @@ -1,5 +1,6 @@ package earth.krakatao.protocol; +import java.util.function.Consumer; import lombok.Getter; import lombok.Setter; @@ -12,19 +13,21 @@ public class KraSocketClientProtocolMessage { private final String uuid; private final short cmdNumber; private final String args; + private final Consumer messageConsumer; @Setter private int trySendCount; @Setter private long time; public KraSocketClientProtocolMessage(byte status, int cmdID, int dest, String uuid, - short cmdNumber, String args) { + short cmdNumber, String args, Consumer messageConsumer) { this.status = status; this.cmdID = cmdID; this.dest = dest; this.uuid = uuid; this.cmdNumber = cmdNumber; this.args = args; + this.messageConsumer = messageConsumer; this.trySendCount = 0; this.time = System.currentTimeMillis();