package cam.netapp; import java.io.*; import java.net.*; import java.util.Calendar; import java.util.Date; import java.text.DateFormat; // //################################################################## // Class ServerManager //################################################################## // // Originator : Dan Delsol (Winter 97') // // Modifications : Chris Anderson 4/28/97,6/18/97 // Modifications : Dan Delsol 5/7/97 // // (C) UCLA // //################################################################## // public class ServerManager extends Thread { public static void fail(Exception e, String msg) { System.err.println(msg + ":" + e); System.exit(1); } // // Constructor : Set up ServerSocket on a Fixed (listening) Port // public ServerManager(int port) { super(); listeningPort = port; if(listeningPort == 0) {listeningPort = DEFAULT_PORT;} availablePort = listeningPort + 1; cpuScheduler = null; verbose = false; logfileFlag = false; } // // Run() Define role of the ServerManager // public void run() { // // Set up Server // if(logfileFlag)createLogFile(); // // pControl = new ProcessControl(); // pControl.start(); // // Start listening for connections // try { listenSocket = new ServerSocket(listeningPort); } catch(IOException e){fail(e, "Exception creating ServerSocket");} if(verbose)System.out.println("ServerManager : Listening on Port : " + listeningPort); try { while(true) { // // Listen on the Port // clientSocket = listenSocket.accept(); // // Create a ApplicationServer instance and then spawn a new thread // to run the ApplicationServer // if(logfileFlag) { logfile.println(getShortDate() + " ["+ clientSocket.getInetAddress()+"] : Request Connection *****************"); logfile.flush(); } if(verbose)System.out.println("ServerManager : Received a request from ["+ clientSocket.getInetAddress()+"]"); if(verbose)System.out.println("ServerManager : Starting Application Server"); if(verbose)System.out.println(" "); ApplicationServer AS = new ApplicationServer(clientSocket, this); if(verbose)AS.setVerboseFlag(verbose); if(logfileFlag) AS.setLogfile(logfile); Thread ASthread = new Thread(AS); ASthread.setName("Application Server"); cpuScheduler.addThread(ASthread); ASthread.start(); if(verbose) {System.out.println(" ServerManager : Thread State "); Thread.currentThread().getThreadGroup().list();} }// while }// try catch(IOException e) {fail(e, "Exception while listening for connections");} }// run() public synchronized int getAvailablePort() { availablePort++; if(availablePort > (listeningPort + 400)) availablePort = (listeningPort + 1); return availablePort; } public void attachScheduler(CPUscheduler S) { cpuScheduler = S; } public void setVerboseFlag(boolean v) { verbose = v; } public void setLogfileFlag(boolean f) { logfileFlag = f; } /** The log file created has the format SM_YYMMDD__HHMM.log YYMMDD = year, month, date HHMM = hour, minute **/ public void createLogFile() { Calendar calendar = Calendar.getInstance(); StringBuffer sb = new StringBuffer(); sb.append("SM_"); sb.append(getCompactDate()); sb.append(".log"); String FileName = new String(sb.toString()); try{logfile = new PrintWriter(new FileOutputStream(FileName,true));} catch(IOException e){System.out.println(e.getMessage());} System.out.println("Log File : " + FileName); } public String getShortDate() { Date TaskDate = new Date(); String dateOut = new String (DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT).format(TaskDate)); return dateOut; } public String getCompactDate() { //Year Month Day Hours Minutes YYMMDD_HHMM Calendar calendar = Calendar.getInstance(); StringBuffer sb = new StringBuffer(); int Year = calendar.get(Calendar.YEAR)%100; if(Year <= 9){sb.append("0"); sb.append(Year);} else{sb.append(Year);} int Month = calendar.get(Calendar.MONTH) + 1; if(Month <= 9){sb.append("0"); sb.append(Month);} else{sb.append(Month);} int Day = calendar.get(Calendar.DAY_OF_MONTH); if(Day <= 9){sb.append("0"); sb.append(Day);} else{sb.append(Day);} sb.append("_"); int Hour = calendar.get(Calendar.HOUR_OF_DAY); if(Hour <= 9){sb.append("0"); sb.append(Hour);} else{sb.append(Hour);} int Minute = calendar.get(Calendar.MINUTE); if(Minute <= 9){sb.append("0"); sb.append(Minute);} else{sb.append(Minute);} return sb.toString(); } // // Data Members // //------------------------------------------------------------------ // MAIN //------------------------------------------------------------------ /**
The main method initializes an instance of cam.netapp.ServerManager and initializes the scheduler cam.netapp.CPUscheduler. It then creates a thread for the ServerManager instance and adds it to the scheduler's thread list.
An optional program argument is an integer that specifies which port the ServerManager will be using to listen for connections. (Default is 6789). **/ public static void main(String[] args) { int port = 0; boolean verbose = false; boolean logfile = false; boolean linuxFlag = false; // // process inputs // int i; if(args.length != 0) { for(i = 0; i < args.length; i++) { if(args[i].charAt(0) == '-') { if(args[i].equals("-verbose")) {verbose = true;} if(args[i].equals("-logfile")) {logfile = true;} if(args[i].equals("-linux")) {linuxFlag = true;} } else { try { port = Integer.parseInt(args[i]);} catch(NumberFormatException e) {port = DEFAULT_PORT;} } } } // // Set up cpuScheduler and ServerManager instance CPUscheduler cpuScheduler = new CPUscheduler(200); cpuScheduler.setName("CPUscheduler"); // // The following is a linux hack, because the scheduler hangs on // linux systems. On linux systems, there still is a cpuScheduler // entity, but all it does is lower the priority of any thread added // to it's pool. // if(linuxFlag) {cpuScheduler.setLinuxFlag(true);} else {cpuScheduler.start(); } // // Instantiate a ServerManager and set flags // ServerManager S = new ServerManager(port); S.setVerboseFlag(verbose); S.setLogfileFlag(logfile); S.setName("Server Manager"); S.attachScheduler(cpuScheduler); cpuScheduler.addThread(S); S.start(); System.out.println("ServerManager : Running"); }// main() public Socket clientSocket; public final static int DEFAULT_PORT = 6789; public int availablePort; public int listeningPort; public ServerSocket listenSocket; public DataInputStream in; public PrintWriter out; public CPUscheduler cpuScheduler; public boolean verbose; public boolean logfileFlag; public PrintWriter logfile; }// class ServerManager