-Renamed TCPclient to MockOutput -Renamed TCPserver toVisualiserInput -set up a heartbeat message to send every 5 seconds -set up a method for mockoutput to handle xml strings -minor edits to VisualiserInput to print the data it gets #story[778]main
parent
8223ae46a1
commit
bd7fefd67e
@ -0,0 +1,135 @@
|
||||
package seng302.Networking;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||
import seng302.Networking.Utils.BoatLocationMessage;
|
||||
import seng302.Networking.Utils.MessageType;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* TCP client to recive information from AC35 data source
|
||||
*/
|
||||
public class MockOutput
|
||||
{
|
||||
private long lastHeartbeatTime;
|
||||
|
||||
private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder();
|
||||
|
||||
//socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port
|
||||
private Socket mockSocket;
|
||||
private DataOutputStream outToVisualiser;
|
||||
|
||||
//a buffer that contains items that are waiting to be sent
|
||||
private ArrayList<byte[]> messagesToSendBuffer = new ArrayList<>();
|
||||
|
||||
private short messageNumber = 1;
|
||||
|
||||
private short xmlSequenceNumber = 1;
|
||||
private int heartbeatSequenceNum = 1;
|
||||
|
||||
|
||||
|
||||
MockOutput() throws IOException{
|
||||
/*******************************Test********************************/
|
||||
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());
|
||||
}
|
||||
|
||||
parseXMLString(xmlString.toString(), 5);
|
||||
|
||||
/*******************************Test********************************/
|
||||
|
||||
/**************sockets*******************/
|
||||
//start Time
|
||||
lastHeartbeatTime = System.currentTimeMillis();
|
||||
|
||||
|
||||
mockSocket = new Socket("localhost", 4942);
|
||||
outToVisualiser = new DataOutputStream(mockSocket.getOutputStream());
|
||||
|
||||
|
||||
//loop that sends
|
||||
while(true)
|
||||
{
|
||||
System.out.println(timeSinceHeartbeat());
|
||||
//sends a heartbeat every 5 seconds
|
||||
if (timeSinceHeartbeat() >= 5.00){
|
||||
outToVisualiser.write(heartbeat());
|
||||
lastHeartbeatTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
//checks the buffer to see if there is anything to send
|
||||
if (messagesToSendBuffer.size() > 0) {
|
||||
for (byte[] binaryMessage : messagesToSendBuffer) {
|
||||
//sends the message to the visualiser
|
||||
outToVisualiser.write(binaryMessage);
|
||||
}
|
||||
//cleans out buffer
|
||||
messagesToSendBuffer.clear();
|
||||
}
|
||||
}
|
||||
/**************sockets*******************/
|
||||
}
|
||||
|
||||
/**
|
||||
* calculates the time since last heartbeat
|
||||
* @return time since last heartbeat
|
||||
*/
|
||||
private double timeSinceHeartbeat() {
|
||||
long now = System.currentTimeMillis();
|
||||
return (now - lastHeartbeatTime) / 1000.0;
|
||||
}
|
||||
|
||||
//returns the heartbeat message
|
||||
private byte[] heartbeat(){
|
||||
byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum);
|
||||
heartbeatSequenceNum++;
|
||||
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage);
|
||||
messageNumber++;
|
||||
return binaryMesageEncoder.getFullMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to give the mockOutput an xml string to be made into a message and sent
|
||||
* @param xmlString the xml string to send
|
||||
* @param messageType the kind of xml string, values given in AC35 spec (5 regatta, 6 race, 7 boat)
|
||||
*/
|
||||
public void parseXMLString(String xmlString, int messageType){
|
||||
XMLMessageEncoder encoder = new XMLMessageEncoder((byte)1, messageNumber, System.currentTimeMillis(), (byte)messageType, xmlSequenceNumber,(short) xmlString.length(), xmlString);
|
||||
//iterates the sequence numbers
|
||||
xmlSequenceNumber++;
|
||||
byte[] encodedXML = encoder.encode();
|
||||
|
||||
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML);
|
||||
//iterates the message number
|
||||
messageNumber++;
|
||||
|
||||
addMessageToBufferToSend(binaryMesageEncoder.getFullMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to give the mocOutput information about boat location to be made into a message and sent
|
||||
*/
|
||||
public void parseBoatLocation(){
|
||||
/// TODO: 26/04/17
|
||||
}
|
||||
|
||||
private void addMessageToBufferToSend(byte[] messagesToSendBuffer) {
|
||||
this.messagesToSendBuffer.add(messagesToSendBuffer);
|
||||
}
|
||||
|
||||
public static void main(String argv[]) throws Exception
|
||||
{
|
||||
MockOutput client = new MockOutput();
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,61 +0,0 @@
|
||||
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.*;
|
||||
|
||||
/**
|
||||
* TCP client to recive information from AC35 data source
|
||||
*/
|
||||
public class TCPClient
|
||||
{
|
||||
public static void main(String argv[]) throws Exception
|
||||
{
|
||||
|
||||
// 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 mockSocket = new Socket("localhost", 4942);
|
||||
|
||||
while(true)
|
||||
{
|
||||
DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream());
|
||||
outToVisualiser.write(binaryMesageEncoder.getFullMessage());
|
||||
}
|
||||
/**************sockets*******************/
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in new issue