From 8f4d50929f4d58c4e1c7c5eb1f8ee79ccc9b4c0e Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 11:53:52 -0700 Subject: [PATCH] Cleaned up implementation of getDREFs in the Java client. - Removed unnecessary loop to try to read several times. - Fixed the way that readUDP detects the length of received packets. --- Java/src/XPlaneConnect.java | 54 ++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index f673074..0bc6453 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -175,12 +175,12 @@ public class XPlaneConnect implements AutoCloseable */ private byte[] readUDP() throws IOException { - byte[] buffer = new byte[2048]; + byte[] buffer = new byte[65536]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); try { socket.receive(packet); - return Arrays.copyOf(buffer, buffer[4]); + return Arrays.copyOf(buffer, packet.getLength()); } catch (SocketTimeoutException ex) { @@ -293,37 +293,29 @@ public class XPlaneConnect implements AutoCloseable sendUDP(os.toByteArray()); //Read response - for(int i = 0; i < 40; ++i) + byte[] data = readUDP(); + if(data.length == 0) { - byte[] data = readUDP(); - if(data.length == 0) - { - continue; - } - if(data.length < 6) - { - throw new Error("Response too short"); //TODO: Make custom error type - } - if(data[5] != drefs.length) - { - throw new Error("Unexpected response length"); //TODO: Make custom error type - } - float[][] result = new float[drefs.length][]; - ByteBuffer bb = ByteBuffer.wrap(data); - bb.order(ByteOrder.LITTLE_ENDIAN); - int cur = 6; - for(int j = 0; j < result.length; ++j) - { - result[j] = new float[data[cur++]]; - for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this - { - result[j][k] = bb.getFloat(cur); - cur += 4; - } - } - return result; + throw new IOException("No response received."); } - throw new IOException("No response received."); + if(data.length < 6) + { + throw new IOException("Response too short"); + } + float[][] result = new float[drefs.length][]; + ByteBuffer bb = ByteBuffer.wrap(data); + bb.order(ByteOrder.LITTLE_ENDIAN); + int cur = 6; + for(int j = 0; j < result.length; ++j) + { + result[j] = new float[data[cur++]]; + for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this + { + result[j][k] = bb.getFloat(cur); + cur += 4; + } + } + return result; } public void sendDREF(String dref, float value) throws IOException