/** * Title: Data Transfer/Routing Simulation

* Description:

* Copyright: Copyright (c) Aaron Morris

* Company: CS522

* @author Aaron Morris * @version 1.0 */ //package datasend; public class Simulator extends Thread { String fileOut; // Output file name boolean Echo; // Write to screen int NumServers; // Number of servers int NumClients; // Number of Clients int EndSimTime; // Time to end Simulation int RequestFrequency; // Request Separation Value int MaxChannelDelay; // Maximum Channel Delay int ServerDelay; // Maximum Server Delay Time int MaxFileSize; // Maximum File Size int DirectorDelay; // Max Director Delay Time int PerBytes; // Server Speed, Bytes/Time Unit EventQueue eventList; // Queue of Events ServerQueue serverList; // Group of Servers ClientQueue clientList; // Group of Clients Director director; // Director Object Stats simStats; // Statistics object RandNum randGen; // RandNum object CS522App app; // Pointer to the GUI boolean Continue=false; // Whether to keep running Sim or not int RequestSep; // Request Separation Modifier public Simulator(String OutFile, boolean WriteToScreen,int NumClients, int NumServers,int EndSimTime,int MaxFileSize,int ServerDelay, int PerBytes,int RequestFrequency, int MaxChannelDelay, int DirectorDelay,int RequestSep,CS522App app) { this.RequestSep = RequestSep; this.MaxFileSize = MaxFileSize; this.PerBytes = PerBytes; this.MaxChannelDelay = MaxChannelDelay; this.ServerDelay = ServerDelay; this.RequestFrequency = RequestFrequency; this.DirectorDelay = DirectorDelay; this.fileOut = OutFile; // Output file to write to this.Echo = WriteToScreen; // Should echo to screen? this.NumServers = NumServers; // Number Servers this.NumClients = NumClients; // Number Clients this.EndSimTime = EndSimTime; // Time to end simulation this.app = app; // Pointer to GUI this.initialize(); // Initialize Simulation } // Initialize Random Number Generator, Event List, Stats Object, Server List, // Client List,Director Object public void initialize() { Channel Src,Dest; Server stemp; Client ctemp; RequestEvent newRE; int RandChannelDelay; // Initialize main objects used by simulation randGen = new RandNum(); eventList = new EventQueue(); simStats = new Stats(fileOut,Echo,app); serverList = new ServerQueue(NumServers,randGen,ServerDelay,MaxFileSize, PerBytes,eventList,simStats); clientList = new ClientQueue(NumClients,randGen,RequestFrequency, RequestSep,eventList,simStats); director = new Director("Director",9999,clientList,serverList,randGen, DirectorDelay,eventList,simStats); // Initialize Server List with brand new servers, random Channel delays for (int i = 0; i < serverList.numServers; i++) { stemp = serverList.getServer(i); RandChannelDelay = randGen.getJavaInt(MaxChannelDelay)+1; Src = new Channel((i+1)*10+3,RandChannelDelay,this.director,stemp); RandChannelDelay = randGen.getJavaInt(MaxChannelDelay)+1; Dest = new Channel((i+1)*10+4,RandChannelDelay,stemp,this.director); stemp.SetSrcChannel(Dest); stemp.SetDestChannel(Src); } // Initialize all Client Objects in Client List for (int i = 0; i < clientList.numClients; i++) { ctemp = clientList.getClient(i); RandChannelDelay = randGen.getJavaInt(MaxChannelDelay)+1; Src = new Channel((i+1)*10+1,RandChannelDelay,ctemp,this.director); RandChannelDelay = randGen.getJavaInt(MaxChannelDelay)+1; Dest = new Channel((i+1)*10+2,RandChannelDelay,this.director,ctemp); ctemp.SetSrcChannel(Src); ctemp.SetDestChannel(Dest); } // Write to output file simStats.report.write("Running Servers : " + NumServers); simStats.report.write("Running Clients : " + NumClients); simStats.report.write("End Simulation Time : " + EndSimTime); simStats.report.write("Director Prop Delay : " + DirectorDelay); simStats.report.write("Server Delay Time : " + ServerDelay); simStats.report.write("KBytes for Server Delay : " + PerBytes); simStats.report.write("Channel Max Delay : " + MaxChannelDelay); simStats.report.write("Maximum File Size : " + MaxFileSize); simStats.report.write("Request Freq Modifier : " + RequestFrequency); simStats.report.write("Min Request Separation : " + RequestSep); simStats.report.write(" "); // Generate Initial Request from Each Server for (int i = 0; i < clientList.getNumClients(); i++) { ctemp = clientList.getClient(i); newRE = ctemp.genRequest(simStats.getGlobalTime()); eventList.enQueue(newRE); } // Generate End of Simulation Event EndSimEvent newESE = new EndSimEvent("ENDSIM",EndSimTime); eventList.enQueue(newESE); } // Method to Start Thread + start Simulation // ----------------------------------------- public void run() { SimEvent nextEvent; int TotalLoad; // While events in Event Queue and running Sim: // 1) Grab first event in Queue // 2) Set global time to grabbed event // 3) Execute the Event (if execute EndSimEvent, exit method) while (Continue) { nextEvent = eventList.deQueue(); simStats.setGlobalTime(nextEvent.getArrivalTime()); nextEvent.execute(eventList,simStats,MaxFileSize,randGen); simStats.avgIdle.update(simStats.getGlobalTime(), serverList.getNumIdle()); TotalLoad = 0; for (int i = 0; i < serverList.getNumServers(); i++) TotalLoad += serverList.getServer(i).getCurrentLoad(); simStats.avgLoad.update(simStats.getGlobalTime(), TotalLoad/serverList.getNumServers()); // Update time in window app.setTitle("CS522 Server/Client Simulation " + " TIME: " + simStats.getGlobalTime()); if (nextEvent.eventType == "ENDSIM") { recap(); app.EndButtonPressed(); Continue = false; return; } // Put the thread to sleep for a short time try { Thread.sleep(25); } catch (Exception ex) { } } } public void recap() { simStats.doReport(); } public void stopSim() { this.Continue = false; } public void startSim() { this.Continue = true; } }