From 0257b9e18c6b20291b36d938131621783b745d0f Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 25 Apr 2017 15:34:49 +1200 Subject: [PATCH] Changed the temp tcp client and server to send packets made by us and other fixes -xmlmessagedecoder now outputs a inputsource for the vis team -tests fixed for the new xmlmessagedecoder -tcpclient now generates a packet encoded by our methods and sends it -tcpserver now recieves a packet encoded by us and prints out some of its info #story[778, 782] --- .../Networking/BinaryMessageDecoder.java | 21 +++--- .../MessageDecoders/XMLMessageDecoder.java | 12 +++- src/main/java/seng302/TCPClient.java | 57 +++++++++++++--- src/main/java/seng302/TCPServer.java | 67 ++++++++++++++++--- .../Networking/BinaryMessageDecoderTest.java | 14 ++-- .../XMLMessageDecoderTest.java | 10 ++- 6 files changed, 143 insertions(+), 38 deletions(-) diff --git a/src/main/java/seng302/Networking/BinaryMessageDecoder.java b/src/main/java/seng302/Networking/BinaryMessageDecoder.java index 544d749c..f7d3d386 100644 --- a/src/main/java/seng302/Networking/BinaryMessageDecoder.java +++ b/src/main/java/seng302/Networking/BinaryMessageDecoder.java @@ -55,7 +55,7 @@ public class BinaryMessageDecoder { crc.update(this.fullMessage); //run through the checks - if (this.message.length != twoByteToInt(this.headerMessageLength)){ + if (this.message.length != twoByteToInt(this.headerMessageLength) && this.message.length != twoByteToIntBE(this.headerMessageLength)){ System.err.println("message length in header does not equal the message length"); System.err.println("message length in header: " + twoByteToInt(this.headerMessageLength)); System.err.println("message length: " + this.message.length); @@ -130,14 +130,7 @@ public class BinaryMessageDecoder { return num; } - private int twoByteToInt(byte[] bytesInt){/* - ByteBuffer byteBuffer = ByteBuffer.allocate(4); - byteBuffer.order(ByteOrder.BIG_ENDIAN); - byteBuffer.put((byte)0); - byteBuffer.put((byte)0); - byteBuffer.put(bytesInt); - int num = byteBuffer.getInt(0);*/ - + private int twoByteToInt(byte[] bytesInt){ byte[] bytes = new byte[2]; bytes[1] = bytesInt[0]; bytes[0] = bytesInt[1]; @@ -146,6 +139,16 @@ public class BinaryMessageDecoder { return num; } + private int twoByteToIntBE(byte[] bytesInt){ + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.put((byte)0); + byteBuffer.put((byte)0); + byteBuffer.put(bytesInt); + int num = byteBuffer.getInt(0); + return num; + } + private long bytesToLong(byte[] bytesLong){ ByteBuffer byteBuffer = ByteBuffer.allocate(8); byteBuffer.order(ByteOrder.BIG_ENDIAN); diff --git a/src/main/java/seng302/Networking/MessageDecoders/XMLMessageDecoder.java b/src/main/java/seng302/Networking/MessageDecoders/XMLMessageDecoder.java index a361ca50..b486b5b8 100644 --- a/src/main/java/seng302/Networking/MessageDecoders/XMLMessageDecoder.java +++ b/src/main/java/seng302/Networking/MessageDecoders/XMLMessageDecoder.java @@ -1,5 +1,8 @@ package seng302.Networking.MessageDecoders; +import org.xml.sax.InputSource; + +import java.io.StringReader; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; @@ -96,7 +99,12 @@ public class XMLMessageDecoder { return xmlMsgLength; } - public String getXmlMessage() { - return xmlMessage; + /** + * this will be used latter for the vis + * @return xml string as inputsource + */ + public InputSource getXmlMessageInputSource() { + InputSource is = new InputSource(new StringReader(xmlMessage)); + return is; } } diff --git a/src/main/java/seng302/TCPClient.java b/src/main/java/seng302/TCPClient.java index e7c92662..62279d13 100644 --- a/src/main/java/seng302/TCPClient.java +++ b/src/main/java/seng302/TCPClient.java @@ -1,4 +1,9 @@ package seng302; +import seng302.Networking.BinaryMesageEncoder; +import seng302.Networking.BinaryMessageDecoder; +import seng302.Networking.MessageEncoders.XMLMessageEncoder; +import seng302.Networking.Utils.MessageType; + import java.io.*; import java.net.*; @@ -9,18 +14,48 @@ public class TCPClient { public static void main(String argv[]) throws Exception { - String sentence; - String modifiedSentence; - BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); + +// String sentence; +// String modifiedSentence; +// BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); +// Socket clientSocket = new Socket("localhost", 6789); +// DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); +// BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); +// sentence = inFromUser.readLine(); +// outToServer.writeBytes(sentence + '\n'); +// modifiedSentence = inFromServer.readLine(); +// System.out.println("FROM SERVER: " + modifiedSentence); +// clientSocket.close(); + TCPClient client = new TCPClient(); + } + + TCPClient() throws IOException{ + StringBuilder xmlString; + + BufferedReader br = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream(("/raceXML/Regatta.xml")))); + + String line; + xmlString = new StringBuilder(); + while((line=br.readLine())!= null){ + xmlString.append(line.trim()); + } + XMLMessageEncoder encodedMessage = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)xmlString.length(), xmlString.toString()); + byte[] encodedXML = encodedMessage.encode(); + + BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), 1, (short)encodedXML.length, encodedXML); + + /**************sockets*******************/ //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port - Socket clientSocket = new Socket("localhost", 4942); - DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); - BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); - sentence = inFromUser.readLine(); - outToServer.writeBytes(sentence + '\n'); - modifiedSentence = inFromServer.readLine(); - System.out.println("FROM SERVER: " + modifiedSentence); - clientSocket.close(); + Socket mockSocket = new Socket("localhost", 4942); + + while(true) + { + DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); + outToVisualiser.write(binaryMesageEncoder.getFullMessage()); + } + /**************sockets*******************/ } + } \ No newline at end of file diff --git a/src/main/java/seng302/TCPServer.java b/src/main/java/seng302/TCPServer.java index 13e9960d..a5dbd810 100644 --- a/src/main/java/seng302/TCPServer.java +++ b/src/main/java/seng302/TCPServer.java @@ -1,6 +1,12 @@ package seng302; +import seng302.Networking.BinaryMessageDecoder; +import seng302.Networking.MessageDecoders.XMLMessageDecoder; + import java.io.*; import java.net.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; /** * TCP server to act as the mock AC35 streaming interface @@ -9,21 +15,60 @@ public class TCPServer { public static void main(String argv[]) throws Exception { - String clientSentence; - String capitalizedSentence; //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port - ServerSocket welcomeSocket = new ServerSocket(4942); + ServerSocket visualiserSocket = new ServerSocket(4942); while(true) { - Socket connectionSocket = welcomeSocket.accept(); - BufferedReader inFromClient = - new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); - DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); - clientSentence = inFromClient.readLine(); - System.out.println("Received: " + clientSentence); - capitalizedSentence = clientSentence.toUpperCase() + '\n'; - outToClient.writeBytes(capitalizedSentence); + Socket connectionSocket = visualiserSocket.accept(); + InputStream inFromClient = connectionSocket.getInputStream(); + byte[] binaryMessage = getBytes(inFromClient); + + BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(binaryMessage); + testDecoder.decode(); + System.out.println("--header--"); + System.out.println(testDecoder.getMessageType()); + System.out.println(testDecoder.getTimeStamp()); + System.out.println(testDecoder.getSourceID()); + System.out.println(testDecoder.getMessageLength()); + System.out.println("----"); + XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage()); + xmlMessageDecoder.decode(); + System.out.println("--message--"); + System.out.println(xmlMessageDecoder.getXmlMessageInputSource()); + } } + + /** + * Takes an inputStream and reads the first 15 bytes (the header) and gets the message length + * for the whole message then reads that and returns the byte array + * @param inStream inputStream from socket + * @return encoded binary messsage bytes + * @throws IOException + */ + private static byte[] getBytes(InputStream inStream) throws IOException { + byte[] headerBytes = new byte[15]; + int i = inStream.read(headerBytes); + System.out.println(i); + byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15); + short messageLen = bytesToShort(messageLenBytes); + System.out.println("m " + messageLen); + byte[] messageBytesWithCRC = new byte[messageLen+4]; + int j = inStream.read(messageBytesWithCRC); + System.out.println(j); + ByteBuffer binaryMessageBytes = ByteBuffer.allocate(i+j); + binaryMessageBytes.put(headerBytes); + binaryMessageBytes.put(messageBytesWithCRC); + return binaryMessageBytes.array(); + } + + private static short bytesToShort(byte[] bytesShort){ + ByteBuffer byteBuffer = ByteBuffer.allocate(2); + byteBuffer.put(bytesShort[0]); + byteBuffer.put(bytesShort[1]); + short shortVal = byteBuffer.getShort(0); + return shortVal; + } + } diff --git a/src/test/java/seng302/Networking/BinaryMessageDecoderTest.java b/src/test/java/seng302/Networking/BinaryMessageDecoderTest.java index 2976ded6..d746a55c 100644 --- a/src/test/java/seng302/Networking/BinaryMessageDecoderTest.java +++ b/src/test/java/seng302/Networking/BinaryMessageDecoderTest.java @@ -2,13 +2,12 @@ package seng302.Networking; import org.junit.Assert; import org.junit.Test; +import org.xml.sax.InputSource; import seng302.Networking.MessageDecoders.XMLMessageDecoder; import seng302.Networking.MessageEncoders.XMLMessageEncoder; import seng302.Networking.Utils.MessageType; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; /** * Created by hba56 on 21/04/17. @@ -54,7 +53,14 @@ public class BinaryMessageDecoderTest { Assert.assertEquals((byte)7, decoderXML.getXmlMsgSubType()); Assert.assertEquals((short)1, decoderXML.getSequenceNumber()); Assert.assertEquals((short)xmlString.length(), decoderXML.getXmlMsgLength()); - Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage()); + + Reader reader = decoderXML.getXmlMessageInputSource().getCharacterStream(); + int c; + String contents = ""; + while((c = reader.read()) != -1) { + contents += (char)c; + } + Assert.assertEquals(xmlString.toString(), contents); }catch (IOException e){ System.out.println(e); diff --git a/src/test/java/seng302/Networking/MessageDecoders/XMLMessageDecoderTest.java b/src/test/java/seng302/Networking/MessageDecoders/XMLMessageDecoderTest.java index ed2011a4..ae644cc7 100644 --- a/src/test/java/seng302/Networking/MessageDecoders/XMLMessageDecoderTest.java +++ b/src/test/java/seng302/Networking/MessageDecoders/XMLMessageDecoderTest.java @@ -7,6 +7,7 @@ import seng302.Networking.MessageEncoders.XMLMessageEncoder; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.Reader; /** * Created by hba56 on 20/04/17. @@ -38,7 +39,14 @@ public class XMLMessageDecoderTest { Assert.assertEquals((byte)7, decoderXML.getXmlMsgSubType()); Assert.assertEquals((short)1, decoderXML.getSequenceNumber()); Assert.assertEquals((short)xmlString.length(), decoderXML.getXmlMsgLength()); - Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage()); + + Reader reader = decoderXML.getXmlMessageInputSource().getCharacterStream(); + int c; + String contents = ""; + while((c = reader.read()) != -1) { + contents += (char)c; + } + Assert.assertEquals(xmlString.toString(), contents); }catch (IOException e){ System.out.println(e);