diff options
| author | Paul Buetow <paul@buetow.org> | 2008-05-17 15:55:43 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-05-17 15:55:43 +0000 |
| commit | 30ac208bac5acb677b2359a3f21f028b5b10a2b3 (patch) | |
| tree | 1683f593e92fddf99303726d505e5d4d77bc5c4b /sources/protocols/implementations | |
| parent | 269558d30023525012a3b0633b030fa2e9151e29 (diff) | |
renamed the package.
Diffstat (limited to 'sources/protocols/implementations')
6 files changed, 411 insertions, 0 deletions
diff --git a/sources/protocols/implementations/BerkelyTimeProtocol.java b/sources/protocols/implementations/BerkelyTimeProtocol.java new file mode 100644 index 0000000..0063de1 --- /dev/null +++ b/sources/protocols/implementations/BerkelyTimeProtocol.java @@ -0,0 +1,127 @@ +package protocols.implementations; + +import protocols.VSProtocol; +import prefs.VSPrefs; +import core.VSMessage; + +import java.util.HashMap; + +public class BerkelyTimeProtocol extends VSProtocol { + /* Berkely Server variables */ + + /* Integer: Process ID, Long: Local time of the process */ + private HashMap<Integer,Long> processTimes = new HashMap<Integer,Long>(); + /* Integer: Process ID, Long: Time of receiving the response from the process */ + private HashMap<Integer,Long> recvTimes = new HashMap<Integer,Long>(); + /* Integer: Process ID, Long: Calculated process times (using the RTT) */ + private HashMap<Integer,Long> realTimesRTT = new HashMap<Integer,Long>(); + /* Time the request/response has started */ + private long requestTime; + + /* Berkely Client vairables */ + + protected void onInit() { + setProtocolClassname(getClass().toString()); + + /* Those prefs are editable through the VSProtocol VSEditor GUI. t_min and t_max in milliseconds */ + setInteger("numProcesses", getNumProcesses()-1); + } + + protected void onClientReset() { + processTimes.clear(); + recvTimes.clear(); + realTimesRTT.clear(); + } + + protected void onClientStart() { + requestTime = process.getTime(); + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("isRequest", true); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a response message, e.g. itself */ + if (!recvMessage.getBoolean("isResponse")) + return; + + Integer processID = new Integer(recvMessage.getInteger("processID")); + Long time = new Long(recvMessage.getLong("time")); + + processTimes.put(processID, time); + recvTimes.put(processID, new Long(process.getTime())); + + /* All processes have comitted the response */ + if (processTimes.size() == getInteger("numProcesses")) { + long avgTime = calculateAverageTime(); + /* Set the local's process time to the new avg reference time */ + process.setTime(avgTime); + /* Tell all other processes what to do in order to justify their times */ + sendJustifyRequests(avgTime); + /* Start "clean" next time */ + onClientReset(); + } + } + + /** + * Calculate the new average time + */ + private long calculateAverageTime() { + long sum = 0; + for (Integer processID : processTimes.keySet()) { + Long localTime = processTimes.get(processID); + Long recvTime = recvTimes.get(processID); + long rtt = recvTime.longValue() - requestTime; + long realProcessTime = localTime + (long) (rtt / 2); + realTimesRTT.put(processID, new Long(realProcessTime)); + sum += realProcessTime; + } + /* Include the time of the local process */ + sum += process.getTime(); + return (long) sum / (1 + getInteger("numProcesses")); + } + + /** + * Sends to all clients a value to justify their local clocks + */ + private void sendJustifyRequests(long avgTime) { + for (Integer processID : processTimes.keySet()) { + long realProcessTime = realTimesRTT.get(processID).longValue(); + long diff = avgTime - realProcessTime; + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("isJustify", true); + message.setLong("timeDiff", diff); + message.setInteger("receiverProcessID", processID); + sendMessage(message); + } + } + + protected void onServerReset() { + } + + protected void onServerRecv(VSMessage recvMessage) { + if (recvMessage.getBoolean("isRequest")) { + VSMessage message = new VSMessage(getProtocolClassname()); + message.setInteger("processID", process.getProcessID()); + message.setLong("time", process.getTime()); + message.setBoolean("isResponse", true); + sendMessage(message); + + } else if (recvMessage.getBoolean("isJustify")) { + /* Check if it's "my" justify message */ + if (recvMessage.getInteger("receiverProcessID") != process.getProcessID()) + return; + + long timeDiff = recvMessage.getLong("timeDiff"); + long recvTime = process.getTime(); + long newTime = process.getTime() + timeDiff; + logg("Neue Zeit: " + newTime); + + process.setTime(newTime); + } + } + + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/BroadcastSturmProtocol.java b/sources/protocols/implementations/BroadcastSturmProtocol.java new file mode 100644 index 0000000..c68b548 --- /dev/null +++ b/sources/protocols/implementations/BroadcastSturmProtocol.java @@ -0,0 +1,48 @@ +package protocols.implementations; + +import java.util.ArrayList; + +import core.VSMessage; +import prefs.VSPrefs; +import protocols.VSProtocol; + +public class BroadcastSturmProtocol extends VSProtocol { + private ArrayList<VSMessage> sentMessages; + private static int broadcastCount; + + protected void onInit() { + setProtocolClassname(getClass().toString()); + sentMessages = new ArrayList<VSMessage>(); + } + + protected void onClientReset() { + } + + protected void onClientStart() { + VSMessage message = new VSMessage(getProtocolClassname()); + message.setInteger("Broadcast", broadcastCount++); + sentMessages.add(message); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + } + + protected void onServerReset() { + sentMessages.clear(); + } + + protected void onServerRecv(VSMessage recvMessage) { + if (!sentMessages.contains(recvMessage)) { + VSMessage message = new VSMessage(getProtocolClassname()); + message.setInteger("Broadcast", recvMessage.getInteger("Broadcast")); + + sentMessages.add(message); + sendMessage(message); + } + } + + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/DummyProtocol.java b/sources/protocols/implementations/DummyProtocol.java new file mode 100644 index 0000000..e79f62d --- /dev/null +++ b/sources/protocols/implementations/DummyProtocol.java @@ -0,0 +1,46 @@ +package protocols.implementations; + +import protocols.VSProtocol; +import core.VSMessage; + +public class DummyProtocol extends VSProtocol { + protected void onInit() { + setProtocolClassname(getClass().toString()); + } + + protected void onClientReset() { + logg("onClientReset()"); + } + + protected void onClientStart() { + logg("onClientStart()"); + + VSMessage message = new VSMessage(getProtocolClassname()); + message.setString("Greeting", "Hello World!"); + message.setInteger("A number", 1); + message.setBoolean("A boolean", true); + message.setFloat("A float", 1.2f); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + logg("onClientRecv("+recvMessage+")"); + + String s = recvMessage.getString("Greeting"); + int n = recvMessage.getInteger("A number"); + boolean b = recvMessage.getBoolean("A boolean"); + float f = recvMessage.getFloat("A float"); + } + + protected void onServerReset() { + logg("onClientReset()"); + } + + protected void onServerRecv(VSMessage recvMessage) { + logg("onServerRecv("+recvMessage+")"); + } + + public String toString() { + return super.toString() + "; Dummy Test"; + } +} diff --git a/sources/protocols/implementations/ExternalTimeSyncProtocol.java b/sources/protocols/implementations/ExternalTimeSyncProtocol.java new file mode 100644 index 0000000..3f40eca --- /dev/null +++ b/sources/protocols/implementations/ExternalTimeSyncProtocol.java @@ -0,0 +1,63 @@ +package protocols.implementations; + +import core.VSMessage; +import prefs.VSPrefs; +import protocols.VSProtocol; + +public class ExternalTimeSyncProtocol extends VSProtocol { + private long requestTime; + private boolean waitingForResponse; + + protected void onInit() { + setProtocolClassname(getClass().toString()); + } + + protected void onClientReset() { + } + + protected void onClientStart() { + requestTime = process.getTime(); + waitingForResponse = true; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("isClientRequest", true); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("isServerResponse")) + return; + + if (waitingForResponse) + waitingForResponse = false; + else + return; + + long recvTime = process.getTime(); + long roundTripTime = recvTime - requestTime; + long serverTime = recvMessage.getLong("time"); + long newTime = serverTime + (long) (roundTripTime / 2); + + logg("Server Zeit: " + serverTime + "; RTT: " + roundTripTime + "; Alte Zeit: " + recvTime + "; Neue Zeit: " + newTime + "; Offset: " + (newTime - recvTime)); + process.setTime(newTime); + } + + protected void onServerReset() { + } + + protected void onServerRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("isClientRequest")) + return; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(getProtocolClassname()); + message.setLong("time", process.getTime()); + message.setBoolean("isServerResponse", true); + sendMessage(message); + } + + public String toString() { + return super.toString(); //+ "; " + prefs.getString("lang.requesttime") + ": " + requestTime; + } +} diff --git a/sources/protocols/implementations/InternalTimeSyncProtocol.java b/sources/protocols/implementations/InternalTimeSyncProtocol.java new file mode 100644 index 0000000..ccef2d3 --- /dev/null +++ b/sources/protocols/implementations/InternalTimeSyncProtocol.java @@ -0,0 +1,70 @@ +package protocols.implementations; + +import core.VSMessage; +import prefs.VSPrefs; +import protocols.VSProtocol; + +public class InternalTimeSyncProtocol extends VSProtocol { + private boolean waitingForResponse; + + protected void onInit() { + setProtocolClassname(getClass().toString()); + + /* Those prefs are editable through the VSProtocol VSEditor GUI. t_min and t_max in milliseconds */ + setLong("t_min", 1000); + setLong("t_max", 5000); + } + + protected void onClientReset() { + } + + protected void onClientStart() { + waitingForResponse = true; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("isClientRequest", true); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a response message, e.g. itself */ + if (!recvMessage.getBoolean("isServerResponse")) + return; + + if (waitingForResponse) + waitingForResponse = false; + else + return; + + long tMax = getLong("t_max"); + long tMin = getLong("t_min"); + long serverTime = recvMessage.getLong("time"); + long newTime = serverTime + (long) ((tMax + tMin) / 2 ); + + logg("Server Zeit: " + serverTime + "; (t_min,t_max): (" + tMin + "," + tMax + + "); Alte Zeit: " + process.getTime() + "; Neue Zeit: " + newTime + + "; Offset: " + (process.getTime() - newTime)); + + process.setTime(newTime); + } + + protected void onServerReset() { + } + + protected void onServerRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a request message, e.g. itself */ + if (!recvMessage.getBoolean("isClientRequest")) + return; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(getProtocolClassname()); + message.setLong("time", process.getTime()); + message.setBoolean("isServerResponse", true); + sendMessage(message); + } + + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/PingPongProtocol.java b/sources/protocols/implementations/PingPongProtocol.java new file mode 100644 index 0000000..aa2ce16 --- /dev/null +++ b/sources/protocols/implementations/PingPongProtocol.java @@ -0,0 +1,57 @@ +package protocols.implementations; + +import core.VSMessage; +import prefs.VSPrefs; +import protocols.VSProtocol; + +public class PingPongProtocol extends VSProtocol { + private int clientCounter; + private int serverCounter; + + protected void onInit() { + setProtocolClassname(getClass().toString()); + } + + protected void onClientReset() { + clientCounter = 0; + } + + protected void onClientStart() { + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("fromClient", true); + message.setInteger("counter", ++clientCounter); + sendMessage(message); + } + + protected void onClientRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("fromServer")) + return; + + logg("message: " + recvMessage.getInteger("counter")); + + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("fromClient", true); + message.setInteger("counter", ++clientCounter); + sendMessage(message); + } + + protected void onServerReset() { + serverCounter = 0; + } + + protected void onServerRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("fromClient")) + return; + + logg("message: " + recvMessage.getInteger("counter")); + + VSMessage message = new VSMessage(getProtocolClassname()); + message.setBoolean("fromServer", true); + message.setInteger("counter", ++serverCounter); + sendMessage(message); + } + + public String toString() { + return super.toString(); + } +} |
