Fixed connecting to galaxy where some packets aren't received at all

This commit is contained in:
Obique PSWG
2015-08-08 16:56:56 -05:00
parent c341318ba3
commit d26b78c92a
4 changed files with 76 additions and 1 deletions
+30
View File
@@ -30,6 +30,7 @@ package network;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import resources.SortedLinkedList;
import network.encryption.Encryption;
@@ -43,6 +44,8 @@ import network.packets.swg.SWGPacket;
public class OutboundNetworkHandler {
private static final long RESEND_TIMEOUT = TimeUnit.MILLISECONDS.toMillis(3000);
private final Queue <byte []> assembleQueue;
private final SortedLinkedList <SequencedPacket> sequenced;
private short sendSequence;
@@ -104,6 +107,7 @@ public class OutboundNetworkHandler {
} else if (!sp.isSent() || sp.getSequence() == sequence) {
pushAssembledUnencrypted(sp.getPacket()); // Pre-encrypted before putting into list
sp.setSent(true);
sp.updateSent();
}
}
}
@@ -121,6 +125,18 @@ public class OutboundNetworkHandler {
}
}
public synchronized void resendOldUnacknowledged() {
synchronized (sequenced) {
for (SequencedPacket packet : sequenced) {
if (packet.hasBeen(RESEND_TIMEOUT)) {
pushAssembledUnencrypted(packet.getPacket()); // Pre-encrypted before putting into list
packet.setSent(true);
packet.updateSent();
}
}
}
}
private byte [] pushAssembledEncrypted(byte [] data) {
data = Encryption.encode(data, crc);
synchronized (assembleQueue) {
@@ -229,11 +245,13 @@ public class OutboundNetworkHandler {
private static class SequencedPacket implements Comparable <SequencedPacket> {
private final short sequence;
private final byte [] packet;
private long sentTime;
private boolean sent;
public SequencedPacket(short sequence, byte [] packet) {
this.sequence = sequence;
this.packet = packet;
this.sentTime = System.nanoTime();
sent = false;
}
@@ -253,6 +271,18 @@ public class OutboundNetworkHandler {
this.sent = sent;
}
public boolean hasBeen(double milliseconds) {
return hasBeen() >= milliseconds;
}
public double hasBeen() {
return (System.nanoTime() - sentTime) / 1E6;
}
public void updateSent() {
sentTime = System.nanoTime();
}
@Override
public int compareTo(SequencedPacket sp) {
if (sequence < sp.getSequence())