package seng302.Networking; import seng302.Networking.BinaryMessageDecoder; import seng302.Networking.MessageDecoders.XMLMessageDecoder; import seng302.Networking.Utils.MessageType; import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; import static seng302.Networking.Utils.ByteConverter.bytesToInt; import static seng302.Networking.Utils.ByteConverter.bytesToShort; /** * TCP server to act as the mock AC35 streaming interface */ public class VisualiserInput { public static void main(String argv[]) throws Exception { //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port ServerSocket visualiserSocket = new ServerSocket(4942); Socket connectionSocket = visualiserSocket.accept(); while(true) { 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("----"); if (testDecoder.getMessageType() == MessageType.XMLMESSAGE.getValue()){ XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage()); xmlMessageDecoder.decode(); System.out.println("--message--"); System.out.println(xmlMessageDecoder.getXmlMessageInputSource()); } if (testDecoder.getMessageType() == MessageType.HEARTBEAT.getValue()){ System.out.println(bytesToInt(testDecoder.getMessage())); } } } /** * 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); byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15); short messageLen = bytesToShort(messageLenBytes, ByteOrder.BIG_ENDIAN); byte[] messageBytesWithCRC = new byte[messageLen+4]; int j = inStream.read(messageBytesWithCRC); ByteBuffer binaryMessageBytes = ByteBuffer.allocate(i+j); binaryMessageBytes.put(headerBytes); binaryMessageBytes.put(messageBytesWithCRC); return binaryMessageBytes.array(); } }