diff --git a/src/com/projectswg/ClientConnection.java b/src/com/projectswg/ClientConnection.java index bfee3a5..d182d0e 100644 --- a/src/com/projectswg/ClientConnection.java +++ b/src/com/projectswg/ClientConnection.java @@ -27,12 +27,6 @@ public class ClientConnection extends Manager { return interceptor.getProperties(); } - public boolean initialize() { - if (!super.initialize()) - return false; - return true; - } - public boolean start() { if (!super.start()) return false; diff --git a/src/com/projectswg/ClientSender.java b/src/com/projectswg/ClientSender.java index 40375ce..3a07b91 100644 --- a/src/com/projectswg/ClientSender.java +++ b/src/com/projectswg/ClientSender.java @@ -65,12 +65,12 @@ public class ClientSender extends Service { port = 0; zone = false; serverRunning.set(false); - packager.start(); - resender.start(); try { loginServer = new UDPServer(loginPort, 496); zoneServer = new UDPServer(0, 496); loginPort = loginServer.getPort(); + packager.start(); + resender.start(); serverRunning.set(true); } catch (BindException e) { Log.err(this, "Failed to bind UDP servers! Login Port: " + loginPort); diff --git a/src/com/projectswg/ServerConnection.java b/src/com/projectswg/ServerConnection.java index 6fd47d2..7b98041 100644 --- a/src/com/projectswg/ServerConnection.java +++ b/src/com/projectswg/ServerConnection.java @@ -160,15 +160,20 @@ public class ServerConnection extends Manager { } private boolean processPacket() { - bufferStream.mark(); - byte bitmask = bufferStream.getByte(); - short messageLength = bufferStream.getShort(); - short decompressedLength = bufferStream.getShort(); - if (bufferStream.remaining() < messageLength) { - bufferStream.rewind(); - return false; + byte bitmask; + short messageLength, decompressedLength; + byte [] message; + synchronized (bufferStream) { + bufferStream.mark(); + bitmask = bufferStream.getByte(); + messageLength = bufferStream.getShort(); + decompressedLength = bufferStream.getShort(); + if (bufferStream.remaining() < messageLength) { + bufferStream.rewind(); + return false; + } + message = bufferStream.getArray(messageLength); } - byte [] message = bufferStream.getArray(messageLength); if ((bitmask & 1) != 0) // Compressed message = Compression.decompress(message, decompressedLength); if (message.length < 6) @@ -292,17 +297,19 @@ public class ServerConnection extends Manager { } private void process() { + while (bufferStream.remaining() >= 5) { + if (!processPacket()) + break; + } synchronized (bufferMutex) { - while (bufferStream.remaining() >= 5) { - if (!processPacket()) - break; - } bufferStream.compact(); } } private void reset() { - bufferStream.reset(); + synchronized (bufferMutex) { + bufferStream.reset(); + } } private boolean connect() { diff --git a/src/com/projectswg/networking/UDPServer.java b/src/com/projectswg/networking/UDPServer.java index d834dbb..dcbdccd 100644 --- a/src/com/projectswg/networking/UDPServer.java +++ b/src/com/projectswg/networking/UDPServer.java @@ -87,6 +87,11 @@ public class UDPServer { } public int getPort() { + port = socket.getLocalPort(); + while (port == 0) { + port = socket.getLocalPort(); + try { Thread.sleep(5); } catch (InterruptedException e) { break; } + } return port; }