From cd816d13b2421dfebc343100db00b6a03f1679cc Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 20:56:48 -0400 Subject: [PATCH 1/6] Implemented the port initialization by setting it to default, when not custom. Made a class variable loginId to implement the loginId for the client. Modified the constructor to add the client loginId and with a try and catch. Also made changes to the args(function) for the client, in order recognize different inputs. --- code/simplechat1/ClientConsole.java | 80 ++++++++++++++++++----------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/code/simplechat1/ClientConsole.java b/code/simplechat1/ClientConsole.java index c9bb4e9..7dab875 100644 --- a/code/simplechat1/ClientConsole.java +++ b/code/simplechat1/ClientConsole.java @@ -1,6 +1,6 @@ // This file contains material supporting section 3.7 of the textbook: // "Object Oriented Software Engineering" and is issued under the open-source -// license found at www.lloseng.com +// license found at www.lloseng.com import java.io.*; import client.*; @@ -9,30 +9,31 @@ /** * This class constructs the UI for a chat client. It implements the * chat interface in order to activate the display() method. - * Warning: Some of the code here is cloned in ServerConsole + * Warning: Some of the code here is cloned in ServerConsole * * @author François Bélanger - * @author Dr Timothy C. Lethbridge + * @author Dr Timothy C. Lethbridge * @author Dr Robert Laganière * @version July 2000 */ -public class ClientConsole implements ChatIF +public class ClientConsole implements ChatIF { //Class variables ************************************************* - + /** * The default port to connect on. */ final public static int DEFAULT_PORT = 5555; - + private static String loginId; + //Instance variables ********************************************** - + /** * The instance of the client that created this ConsoleChat. */ ChatClient client; - + //Constructors **************************************************** /** @@ -41,13 +42,13 @@ public class ClientConsole implements ChatIF * @param host The host to connect to. * @param port The port to connect on. */ - public ClientConsole(String host, int port) + public ClientConsole(String host, int port,String loginId) { - try + try { - client= new ChatClient(host, port, this); - } - catch(IOException exception) + client= new ChatClient(host,port,loginId,this); + } + catch(IOException exception) { System.out.println("Error: Can't setup connection!" + " Terminating client."); @@ -55,28 +56,28 @@ public ClientConsole(String host, int port) } } - + //Instance methods ************************************************ - + /** - * This method waits for input from the console. Once it is + * This method waits for input from the console. Once it is * received, it sends it to the client's message handler. */ - public void accept() + public void accept() { try { - BufferedReader fromConsole = + BufferedReader fromConsole = new BufferedReader(new InputStreamReader(System.in)); String message; - while (true) + while (true) { message = fromConsole.readLine(); client.handleMessageFromClientUI(message); } - } - catch (Exception ex) + } + catch (Exception ex) { System.out.println ("Unexpected error while reading from console!"); @@ -89,34 +90,55 @@ public void accept() * * @param message The string to be displayed. */ - public void display(String message) + public void display(String message) { - System.out.println("> " + message); + System.out.println(message); } - + //Class methods *************************************************** - + /** * This method is responsible for the creation of the Client UI. * * @param args[0] The host to connect to. */ - public static void main(String[] args) + public static void main(String[] args) { String host = ""; int port = 0; //The port number + loginId = ""; + try{ + loginId = (args[0]); + } + catch(ArrayIndexOutOfBoundsException e) + {} + + try{ + port = Integer.parseInt(args[1]); + } + catch(ArrayIndexOutOfBoundsException e) + { + port = DEFAULT_PORT; + } try { - host = args[0]; + host = args[2]; } catch(ArrayIndexOutOfBoundsException e) { host = "localhost"; } - ClientConsole chat= new ClientConsole(host, DEFAULT_PORT); - chat.accept(); //Wait for console data + if(args.length > 0){ + try{ + ClientConsole chat= new ClientConsole(host,port,loginId); + chat.accept(); //Wait for console data + // System.out.println(loginId+"has logged in"); + }catch (Exception e) {} + }else{ + System.out.println("ERROR - No login ID specified. Connection aborted."); + } } } //End of ConsoleChat class From 3af91ac78d7b483c9b1e4dbc615637917593103c Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 21:06:38 -0400 Subject: [PATCH 2/6] Implemented ServerConsole which is a class depending on the echoserver for processing data. Added a class varaible loginId to keep track of it and also to return in the serverUI. Modified the handleMessageFromClient method to make changes to recieve and record the loginId of the client. Implemented hook methods ClientConnected and ClientDisconnected from the AbstractServer. --- code/simplechat1/EchoServer.java | 84 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/code/simplechat1/EchoServer.java b/code/simplechat1/EchoServer.java index d4f3a1a..3004712 100644 --- a/code/simplechat1/EchoServer.java +++ b/code/simplechat1/EchoServer.java @@ -1,12 +1,13 @@ // This file contains material supporting section 3.7 of the textbook: // "Object Oriented Software Engineering" and is issued under the open-source -// license found at www.lloseng.com +// license found at www.lloseng.com import java.io.*; import ocsf.server.*; +import common.*; /** - * This class overrides some of the methods in the abstract + * This class overrides some of the methods in the abstract * superclass in order to give more functionality to the server. * * @author Dr Timothy C. Lethbridge @@ -15,43 +16,60 @@ * @author Paul Holden * @version July 2000 */ -public class EchoServer extends AbstractServer +public class EchoServer extends AbstractServer { //Class variables ************************************************* - + /** * The default port to listen on. */ final public static int DEFAULT_PORT = 5555; - + ChatIF serverUI; + private static String loginId; + //Constructors **************************************************** - + /** * Constructs an instance of the echo server. * * @param port The port number to connect on. */ - public EchoServer(int port) + public EchoServer(int port,ChatIF serverUI) { super(port); + this.serverUI = serverUI; } - + //Instance methods ************************************************ - + /** * This method handles any messages received from the client. * * @param msg The message received from the client. * @param client The connection from which the message originated. */ + + // public void setInfo(String loginId){ + // this.loginId = loginId; + // } + // public String getInfo(){ + // return loginId; + // } + public void handleMessageFromClient - (Object msg, ConnectionToClient client) - { + (Object msg, ConnectionToClient client){ + String temp[] = String.valueOf(msg).split(" "); + if(temp[0].equals("#login") && temp.length> 1){ + client.setInfo(loginId,temp[1]); + this.sendToAllClients(client.getInfo(loginId) + " has logged in"); + System.out.println("Message received: " + msg + " from " + client); + }else{ System.out.println("Message received: " + msg + " from " + client); - this.sendToAllClients(msg); + this.sendToAllClients(client.getInfo(loginId) + ">" + msg); } - +} + /** * This method overrides the one in the superclass. Called * when the server starts listening for connections. @@ -61,7 +79,7 @@ protected void serverStarted() System.out.println ("Server listening for connections on port " + getPort()); } - + /** * This method overrides the one in the superclass. Called * when the server stops listening for connections. @@ -71,39 +89,23 @@ protected void serverStopped() System.out.println ("Server has stopped listening for connections."); } - + + protected void clientConnected(ConnectionToClient client) { + System.out.println("The Server has accepted a client "); + } + protected void clientDisconnected(ConnectionToClient client) { + System.out.println("The client has disconnected"); + this.sendToAllClients(client.getInfo(loginId) + "has logged off"); + } //Class methods *************************************************** - + /** - * This method is responsible for the creation of + * This method is responsible for the creation of * the server instance (there is no UI in this phase). * - * @param args[0] The port number to listen on. Defaults to 5555 + * @param args[0] The port number to listen on. Defaults to 5555 * if no argument is entered. */ - public static void main(String[] args) - { - int port = 0; //Port to listen on - try - { - port = Integer.parseInt(args[0]); //Get port from command line - } - catch(Throwable t) - { - port = DEFAULT_PORT; //Set port to 5555 - } - - EchoServer sv = new EchoServer(port); - - try - { - sv.listen(); //Start listening for connections - } - catch (Exception ex) - { - System.out.println("ERROR - Could not listen for clients!"); - } - } } //End of EchoServer class From 43e4aa467066289d51a282446156b3d58351db60 Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 21:12:40 -0400 Subject: [PATCH 3/6] Implemented commands to better the UI of the client and improve the use of the application. Created class variables, logoff and loginId which help setting up the commands. Made appropriate changes to the constructors to implement the variables created. Modified the handleMessageFromClientUI file to implement the commands created. Implemented hook methods from Abstract Client connectionClosed and connectionException. --- code/simplechat1/client/ChatClient.java | 145 +++++++++++++++++++----- 1 file changed, 117 insertions(+), 28 deletions(-) diff --git a/code/simplechat1/client/ChatClient.java b/code/simplechat1/client/ChatClient.java index fe1401e..24093c6 100644 --- a/code/simplechat1/client/ChatClient.java +++ b/code/simplechat1/client/ChatClient.java @@ -1,6 +1,6 @@ // This file contains material supporting section 3.7 of the textbook: // "Object Oriented Software Engineering" and is issued under the open-source -// license found at www.lloseng.com +// license found at www.lloseng.com package client; @@ -20,16 +20,20 @@ public class ChatClient extends AbstractClient { //Instance variables ********************************************** - + /** - * The interface type variable. It allows the implementation of + * The interface type variable. It allows the implementation of * the display method in the client. */ - ChatIF clientUI; + ChatIF clientUI; + private boolean logoff; + private static String loginId; + + + - //Constructors **************************************************** - + /** * Constructs an instance of the chat client. * @@ -37,47 +41,124 @@ public class ChatClient extends AbstractClient * @param port The port number to connect on. * @param clientUI The interface type variable. */ - - public ChatClient(String host, int port, ChatIF clientUI) - throws IOException + + public ChatClient(String host,int port,String loginId, ChatIF clientUI) + throws IOException { super(host, port); //Call the superclass constructor this.clientUI = clientUI; + this.loginId = loginId; + try{ openConnection(); + sendToServer("#login " + loginId); + logoff = false; + }catch (Exception e) { + System.out.println("Cannot open connection awaiting command"); + logoff = true; } +} + - //Instance methods ************************************************ - + /** * This method handles all data that comes in from the server. * * @param msg The message from the server. */ - public void handleMessageFromServer(Object msg) + public void handleMessageFromServer(Object msg) { clientUI.display(msg.toString()); } /** - * This method handles all data coming from the UI + * This method handles all data coming from the UI * - * @param message The message from the UI. + * @param message The message from the UI. */ - public void handleMessageFromClientUI(String message) - { - try - { - sendToServer(message); - } - catch(IOException e) - { - clientUI.display - ("Could not send message to server. Terminating client."); - quit(); - } - } - + public void handleMessageFromClientUI(String message){ + String temp3[] = message.split(" "); + try { + if(message.equals("#quit")){ + clientUI.display("Client has quit"); + System.out.println("Closing Connection"); + try{ + sendToServer(loginId + " is disconnected"); + quit(); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if(message.equals("#logoff")){ + try{ + clientUI.display("Client has disconnected"); + System.out.println("Closing Connection"); + logoff = true; + sendToServer(loginId + "is disconnected"); + closeConnection(); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if(temp3[0].equals("#sethost")&& logoff){ + System.out.println("Setting Host "); + try{ + String temp[] = message.split(" "); + String newhost = temp[1]; + setHost(newhost); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if(temp3[0].equals("#login")&& logoff){ + if(temp3[1].equals(loginId)){ + try{ + System.out.println(loginId + " has connected to server"); + openConnection(); + sendToServer("#login " + loginId); + logoff = false; + }catch (Exception e) { + System.out.println("Requires a loginId"); + } + } + } + else if(temp3[0].equals("#setport")&& logoff){ + System.out.println("Setting Port "); + try{ + String temp1[] = message.split(" "); + int newport = Integer.parseInt(temp1[1]); + setPort(newport); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if(message.equals("#gethost")){ + try{ + System.out.println("The host is " +getHost()); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if (message.equals("#getport")) { + try { + System.out.println("The port is " +getPort()); + }catch (Exception e) { + System.out.println("ERROR!"); + } + } + else if(message.charAt(0)=='#'){ + System.out.println("ERROR! Command invalid"); + }else{ + sendToServer(message); + } + } + catch(IOException e) + { + clientUI.display + ("Could not send message to server.Terminating client."); + quit(); + } +} /** * This method terminates the client. */ @@ -90,5 +171,13 @@ public void quit() catch(IOException e) {} System.exit(0); } + + protected void connectionClosed() { + clientUI.display("Connection Closed"); + } + protected void connectionException(Exception exception) { + clientUI.display("The connection has terminated"); + System.exit(0); + } } //End of ChatClient class From ea2edefbe8ed689b67b321a0c10c9cf0ab08e9fb Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 21:19:51 -0400 Subject: [PATCH 4/6] This is a class created to implement the echoserver main method and all the commands which the server uses. Created class variables to support the commands created.Modified the display method and added new fucntions to make the main method functional. --- code/simplechat1/ServerConsole.java | 145 ++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 code/simplechat1/ServerConsole.java diff --git a/code/simplechat1/ServerConsole.java b/code/simplechat1/ServerConsole.java new file mode 100644 index 0000000..120a943 --- /dev/null +++ b/code/simplechat1/ServerConsole.java @@ -0,0 +1,145 @@ +import java.io.*; +import client.*; +import common.*; + +public class ServerConsole implements ChatIF{ + +// class variables +//default port number + final public static int DEFAULT_PORT = 5555; + +//EchoServer object and server status +// "false" represents the server is open +// "true" represents the server is closed +private EchoServer sc; +private boolean serverstatus = false; + +//Constructor +public ServerConsole(int port){ + sc = new EchoServer(port,this); +} +public EchoServer get(){ + return sc; +} + + +// Message handle server +public void handleMessageFromServer(String message){ + String temp2[] = message.split(" "); + if(message.equals("#quit")){ + display("Client has quit"); + System.out.println("Closing Connection"); + try{ + sc.close(); + System.exit(0); + }catch (Exception e) { + System.out.println("ERROR!"); + } + }else if(message.equals("#stop")){ + display("Server has stopped listening for connections"); + System.out.println("Closing Connection"); + try{ + sc.stopListening(); + serverstatus = true; + }catch (Exception e) { + System.out.println("ERROR!"); + + } + }else if(message.equals("#close")){ + display("Server has stopped connection"); + System.out.println("Closing Connections"); + try{ + sc.close(); + serverstatus = true; + }catch (Exception e) { + System.out.println("ERROR!"); + } + }else if(temp2[0].equals("#setport")&& serverstatus){ + display("Set port"); + try{ + String temp[] = message.split(" "); + int newport = Integer.parseInt(temp[1]); + System.out.println("Setting the port to" + newport); + sc.setPort(newport); + sc.listen(); + serverstatus =false; + + }catch (Exception e) { + System.out.println("ERROR!"); + } +}else if(message.equals("#start")&& serverstatus){ + display("Server is listening for new clients"); + System.out.println("Opening Connections"); + try{ + sc.listen(); + serverstatus = false; + }catch (Exception e) { + System.out.println("ERROR!"); + } +}else if(message.equals("#getport")){ + try{ + System.out.println(sc.getPort()); + }catch (Exception e) { + System.out.println("ERROR!"); + } +}else if(message.charAt(0) == '#'){ + System.out.println("ERROR! Command invalid"); +}else{ + display(message); + } +} + + +public void accept() +{ + try + { + BufferedReader fromConsole = + new BufferedReader(new InputStreamReader(System.in)); + String message; + + while (true) + { + message = fromConsole.readLine(); + handleMessageFromServer(message); + } + } + catch (Exception ex) + { + System.out.println + ("Unexpected error while reading from console!"); + } +} +public void display(String message) +{ + sc.sendToAllClients("SERVER MSG>" + message); +} +public static void main(String[] args) +{ + int port = 0; //Port to listen on + + try + { + port = Integer.parseInt(args[0]); //Get port from command line + } + catch(Throwable t) + { + port = DEFAULT_PORT; //Set port to 5555 + } + + ServerConsole sc = new ServerConsole(port); + + try + { + sc.get().listen(); //Start listening for connections + sc.accept(); + } + catch (Exception ex) + { + System.out.println("ERROR - Could not listen for clients!"); + } +} + + + +} From 77d888a0da0cd63204e9d66a3bbb3e93abc0e006 Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 21:22:36 -0400 Subject: [PATCH 5/6] Added some implementations of the ocsf framework to the working classes. These methods helped with the UI and the creation of commands. --- .../ocsf/client/AbstractClient.java | 333 +++++++++++++ .../ocsf/client/AdaptableClient.java | 82 ++++ .../ocsf/client/ObservableClient.java | 181 +++++++ code/simplechat1/ocsf/index.html | 22 + .../ocsf/server/AbstractServer.java | 459 ++++++++++++++++++ .../ocsf/server/AdaptableServer.java | 129 +++++ .../ocsf/server/ConnectionToClient.java | 270 +++++++++++ .../server/ObservableOriginatorServer.java | 165 +++++++ .../ocsf/server/ObservableServer.java | 309 ++++++++++++ .../ocsf/server/OriginatorMessage.java | 61 +++ 10 files changed, 2011 insertions(+) create mode 100644 code/simplechat1/ocsf/client/AbstractClient.java create mode 100644 code/simplechat1/ocsf/client/AdaptableClient.java create mode 100644 code/simplechat1/ocsf/client/ObservableClient.java create mode 100644 code/simplechat1/ocsf/index.html create mode 100644 code/simplechat1/ocsf/server/AbstractServer.java create mode 100644 code/simplechat1/ocsf/server/AdaptableServer.java create mode 100644 code/simplechat1/ocsf/server/ConnectionToClient.java create mode 100644 code/simplechat1/ocsf/server/ObservableOriginatorServer.java create mode 100644 code/simplechat1/ocsf/server/ObservableServer.java create mode 100644 code/simplechat1/ocsf/server/OriginatorMessage.java diff --git a/code/simplechat1/ocsf/client/AbstractClient.java b/code/simplechat1/ocsf/client/AbstractClient.java new file mode 100644 index 0000000..e905636 --- /dev/null +++ b/code/simplechat1/ocsf/client/AbstractClient.java @@ -0,0 +1,333 @@ +// This file contains material supporting section 3.7 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.client; + +import java.io.*; +import java.net.*; + +/** + * The AbstractClient contains all the methods necessary to set + * up the client side of a client-server architecture. When a client is thus + * connected to the server, the two programs can then exchange + * Object instances. + *

+ * Method handleMessageFromServer must be defined by a concrete + * subclass. Several other hook methods may also be overriden. + *

+ * Several public service methods are provided to application that use this + * framework. + *

+ * Project Name: OCSF (Object Client-Server Framework) + *

+ * + * @author Dr. Robert Laganière + * @author Dr. Timothy C. Lethbridge + * @author François Bél;langer + * @author Paul Holden + * @version February 2001 (2.12) + */ +public abstract class AbstractClient implements Runnable { + + // INSTANCE VARIABLES *********************************************** + + /** + * Sockets are used in the operating system as channels of communication + * between two processes. + * + * @see java.net.Socket + */ + private Socket clientSocket; + + /** + * The stream to handle data going to the server. + */ + private ObjectOutputStream output; + + /** + * The stream to handle data from the server. + */ + private ObjectInputStream input; + + /** + * The thread created to read data from the server. + */ + private Thread clientReader; + + /** + * Indicates if the thread is ready to stop. Needed so that the loop in the + * run method knows when to stop waiting for incoming messages. + */ + private boolean readyToStop = false; + + /** + * The server's host name. + */ + private String host; + + /** + * The port number. + */ + private int port; + + // CONSTRUCTORS ***************************************************** + + /** + * Constructs the client. + * + * @param host + * the server's host name. + * @param port + * the port number. + */ + public AbstractClient(String host, int port) { + // Initialize variables + this.host = host; + this.port = port; + } + + // INSTANCE METHODS ************************************************* + + /** + * Opens the connection with the server. If the connection is already + * opened, this call has no effect. + * + * @exception IOException + * if an I/O error occurs when opening. + */ + final public void openConnection() throws IOException { + // Do not do anything if the connection is already open + if (isConnected()) + return; + + // Create the sockets and the data streams + try { + clientSocket = new Socket(host, port); + output = new ObjectOutputStream(clientSocket.getOutputStream()); + input = new ObjectInputStream(clientSocket.getInputStream()); + } catch (IOException ex) + // All three of the above must be closed when there is a failure + // to create any of them + { + try { + closeAll(); + } catch (Exception exc) { + } + + throw ex; // Rethrow the exception. + } + + clientReader = new Thread(this); // Create the data reader thread + readyToStop = false; + clientReader.start(); // Start the thread + } + + /** + * Sends an object to the server. This is the only way that methods should + * communicate with the server. + * + * @param msg + * The message to be sent. + * @exception IOException + * if an I/O error occurs when sending + */ + final public void sendToServer(Object msg) throws IOException { + if (clientSocket == null || output == null) + throw new SocketException("socket does not exist"); + + output.writeObject(msg); + } + + /** + * Reset the object output stream so we can use the same + * buffer repeatedly. This would not normally be used, but is necessary + * in some circumstances when Java refuses to send data that it thinks has been sent. + */ + final public void forceResetAfterSend() throws IOException { + output.reset(); + } + + /** + * Closes the connection to the server. + * + * @exception IOException + * if an I/O error occurs when closing. + */ + final public void closeConnection() throws IOException { + // Prevent the thread from looping any more + readyToStop = true; + + try { + closeAll(); + } finally { + // Call the hook method + connectionClosed(); + } + } + + // ACCESSING METHODS ------------------------------------------------ + + /** + * @return true if the client is connnected. + */ + final public boolean isConnected() { + return clientReader != null && clientReader.isAlive(); + } + + /** + * @return the port number. + */ + final public int getPort() { + return port; + } + + /** + * Sets the server port number for the next connection. The change in port + * only takes effect at the time of the next call to openConnection(). + * + * @param port + * the port number. + */ + final public void setPort(int port) { + this.port = port; + } + + /** + * @return the host name. + */ + final public String getHost() { + return host; + } + + /** + * Sets the server host for the next connection. The change in host only + * takes effect at the time of the next call to openConnection(). + * + * @param host + * the host name. + */ + final public void setHost(String host) { + this.host = host; + } + + /** + * returns the client's description. + * + * @return the client's Inet address. + */ + final public InetAddress getInetAddress() { + return clientSocket.getInetAddress(); + } + + // RUN METHOD ------------------------------------------------------- + + /** + * Waits for messages from the server. When each arrives, a call is made to + * handleMessageFromServer(). Not to be explicitly called. + */ + final public void run() { + connectionEstablished(); + + // The message from the server + Object msg; + + // Loop waiting for data + + try { + while (!readyToStop) { + // Get data from Server and send it to the handler + // The thread waits indefinitely at the following + // statement until something is received from the server + msg = input.readObject(); + + // Concrete subclasses do what they want with the + // msg by implementing the following method + handleMessageFromServer(msg); + } + } catch (Exception exception) { + if (!readyToStop) { + try { + closeAll(); + } catch (Exception ex) { + } + + connectionException(exception); + } + } finally { + clientReader = null; + } + } + + // METHODS DESIGNED TO BE OVERRIDDEN BY CONCRETE SUBCLASSES --------- + + /** + * Hook method called after the connection has been closed. The default + * implementation does nothing. The method may be overriden by subclasses to + * perform special processing such as cleaning up and terminating, or + * attempting to reconnect. + */ + protected void connectionClosed() { + } + + /** + * Hook method called each time an exception is thrown by the client's + * thread that is waiting for messages from the server. The method may be + * overridden by subclasses. + * + * @param exception + * the exception raised. + */ + protected void connectionException(Exception exception) { + } + + /** + * Hook method called after a connection has been established. The default + * implementation does nothing. It may be overridden by subclasses to do + * anything they wish. + */ + protected void connectionEstablished() { + } + + /** + * Handles a message sent from the server to this client. This MUST be + * implemented by subclasses, who should respond to messages. + * + * @param msg + * the message sent. + */ + protected abstract void handleMessageFromServer(Object msg); + + // METHODS TO BE USED FROM WITHIN THE FRAMEWORK ONLY ---------------- + + /** + * Closes all aspects of the connection to the server. + * + * @exception IOException + * if an I/O error occurs when closing. + */ + private void closeAll() throws IOException { + try { + // Close the socket + if (clientSocket != null) + clientSocket.close(); + + // Close the output stream + if (output != null) + output.close(); + + // Close the input stream + if (input != null) + input.close(); + } finally { + // Set the streams and the sockets to NULL no matter what + // Doing so allows, but does not require, any finalizers + // of these objects to reclaim system resources if and + // when they are garbage collected. + output = null; + input = null; + clientSocket = null; + } + } +} +// end of AbstractClient class \ No newline at end of file diff --git a/code/simplechat1/ocsf/client/AdaptableClient.java b/code/simplechat1/ocsf/client/AdaptableClient.java new file mode 100644 index 0000000..143592e --- /dev/null +++ b/code/simplechat1/ocsf/client/AdaptableClient.java @@ -0,0 +1,82 @@ +// This file contains material supporting section 6.13 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.client; + +import java.io.*; +import java.net.*; +import java.util.*; + +/** +* The AdaptableClient is a class +* that extends the AbstractClient in place of +* the ObservableClient .

+* +* Project Name: OCSF (Object Client-Server Framework)

+* +* @author Dr. Robert Laganière +* @version Febuary 2001 +*/ +class AdaptableClient extends AbstractClient +{ + //Instance variables ********************************************** + + /** + * The proxy used to simulate multiple class inheritance. + */ + private ObservableClient client; + +// CONSTRUCTORS ***************************************************** + + /** + * Constructs the client adapter. + * + * @param host the server's host name. + * @param port the port number. + */ + public AdaptableClient(String host, int port, ObservableClient client) + { + super(host, port); + this.client = client; + } + +// OVERRIDDEN METHODS ************************************************* + + /** + * Hook method called after the connection has been closed. + */ + final protected void connectionClosed() + { + client.connectionClosed(); + } + + /** + * Hook method called after an exception + * is raised by the client listening thread. + * + * @param exception the exception raised. + */ + final protected void connectionException(Exception exception) + { + client.connectionException(exception); + } + + /** + * Hook method called after a connection has been established. + */ + final protected void connectionEstablished() + { + client.connectionEstablished(); + } + + /** + * Handles a message sent from the server to this client. + * + * @param msg the message sent. + */ + final protected void handleMessageFromServer(Object msg) + { + client.handleMessageFromServer(msg); + } +} diff --git a/code/simplechat1/ocsf/client/ObservableClient.java b/code/simplechat1/ocsf/client/ObservableClient.java new file mode 100644 index 0000000..a816488 --- /dev/null +++ b/code/simplechat1/ocsf/client/ObservableClient.java @@ -0,0 +1,181 @@ +// This file contains material supporting section 6.13 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.client; + +import java.util.*; +import java.io.*; +import java.net.*; + +/** + * This class acts as a subclass of AbstractClient + * and is also an Observable class. + * Each time a new message is received, observers are notified. + * + * @author Dr Robert Laganière + * @author Dr Timothy C. Lethbridge + * @author François Bélange + * @version Febuary 2001 + */ +public class ObservableClient extends Observable +{ + // Class variables *************************************************** + + /** + * Indicates occurence of a connection exception. + */ + public static final String CONNECTION_EXCEPTION = "#OC:Connection error."; + + /** + * Indicates a close of the connection to server. + */ + public static final String CONNECTION_CLOSED = "#OC:Connection closed."; + + /** + * Indicates establishment of a connection to server. + */ + public static final String CONNECTION_ESTABLISHED = "#OC:Connection established."; + + //Instance variables ********************************************** + + /** + * The service instance used to simulate multiple class inheritance. + */ + private AdaptableClient service; + + //Constructor ***************************************************** + + public ObservableClient(String host, int port) + { + service = new AdaptableClient(host, port, this); + } + + //Instance methods ************************************************ + + /** + * Opens the connections with the server. + */ + final public void openConnection() throws IOException + { + service.openConnection(); + } + + /** + * Closes the connection to the server. + */ + final public void closeConnection() throws IOException + { + service.closeConnection(); + } + + /** + * Sends an object to the server. This is the only way that + * methods should communicate with the server. + * + * @param msg The message to be sent. + */ + final public void sendToServer(Object msg) throws IOException + { + service.sendToServer(msg); + } + +// ACCESSING METHODS ------------------------------------------------ + + /** + * @used to find out if the client is connnected. + */ + final public boolean isConnected() + { + return service.isConnected(); + } + + /** + * @return the port number. + */ + final public int getPort() + { + return service.getPort(); + } + + /** + * Sets the server port number for the next connection. + * Only has effect if the client is not currently connected. + * + * @param port the port number. + */ + final public void setPort(int port) + { + service.setPort(port); + } + + /** + * @return the host name. + */ + final public String getHost() + { + return service.getHost(); + } + + /** + * Sets the server host for the next connection. + * Only has effect if the client is not currently connected. + * + * @param host the host name. + */ + final public void setHost(String host) + { + service.setHost(host); + } + + /** + * @return the client's Inet address. + */ + final public InetAddress getInetAddress() + { + return service.getInetAddress(); + } + + + /** + * This method is used to handle messages from the server. This method + * can be overriden but should always call notifyObservers(). + * + * @param message The message received from the client. + */ + protected void handleMessageFromServer(Object message) + { + setChanged(); + notifyObservers(message); + } + + /** + * Hook method called after the connection has been closed. + */ + protected void connectionClosed() + { + setChanged(); + notifyObservers(CONNECTION_CLOSED); + } + + /** + * Hook method called each time an exception + * is raised by the client listening thread. + * + * @param exception the exception raised. + */ + protected void connectionException(Exception exception) + { + setChanged(); + notifyObservers(CONNECTION_EXCEPTION); + } + + /** + * Hook method called after a connection has been established. + */ + protected void connectionEstablished() + { + setChanged(); + notifyObservers(CONNECTION_ESTABLISHED); + } +} diff --git a/code/simplechat1/ocsf/index.html b/code/simplechat1/ocsf/index.html new file mode 100644 index 0000000..13025a0 --- /dev/null +++ b/code/simplechat1/ocsf/index.html @@ -0,0 +1,22 @@ + + +Installing and Running OCSF + + + +

To install OCSF, simply compile all the .java files in the client and +server directories.

+ +

OCSF is a Framework, so this directory contains no main program. To +learn how it works, consult the book +"Object-Oriented Software Engineering: Practical Software Development +using UML and Java" by Lethbridge and Laganière.

+ +

To use OCSF, import the "ocsf.client" or "ocsf.server" package in your +application code. Make sure that the ocsf directory is in your classpath +when you compile your application.

+ +

Back to the source code page.

+ + + diff --git a/code/simplechat1/ocsf/server/AbstractServer.java b/code/simplechat1/ocsf/server/AbstractServer.java new file mode 100644 index 0000000..0134b22 --- /dev/null +++ b/code/simplechat1/ocsf/server/AbstractServer.java @@ -0,0 +1,459 @@ +// This file contains material supporting section 3.8 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +import java.net.*; +import java.util.*; +import java.io.*; + +/** +* The AbstractServer class maintains a thread that waits +* for connection attempts from clients. When a connection attempt occurs +* it creates a new ConnectionToClient instance which +* runs as a thread. When a client is thus connected to the +* server, the two programs can then exchange Object +* instances.

+* +* Method handleMessageFromClient must be defined by +* a concrete subclass. Several other hook methods may also be +* overriden.

+* +* Several public service methods are provided to applications that use +* this framework, and several hook methods are also available

+* +* Project Name: OCSF (Object Client-Server Framework)

+* +* @author Dr Robert Laganière +* @author Dr Timothy C. Lethbridge +* @author François Bélanger +* @author Paul Holden +* @version February 2001 (2.12) +* @see ocsf.server.ConnectionToClient +*/ +public abstract class AbstractServer implements Runnable +{ + // INSTANCE VARIABLES ********************************************* + + /** + * The server socket: listens for clients who want to connect. + */ + private ServerSocket serverSocket = null; + + /** + * The connection listener thread. + */ + private Thread connectionListener; + + /** + * The port number + */ + private int port; + + /** + * The server timeout while for accepting connections. + * After timing out, the server will check to see if a command to + * stop the server has been issued; it not it will resume accepting + * connections. + * Set to half a second by default. + */ + private int timeout = 500; + + /** + * The maximum queue length; i.e. the maximum number of clients that + * can be waiting to connect. + * Set to 10 by default. + */ + private int backlog = 10; + + /** + * The thread group associated with client threads. Each member of the + * thread group is a ConnectionToClient . + */ + private ThreadGroup clientThreadGroup; + + /** + * Indicates if the listening thread is ready to stop. Set to + * false by default. + */ + private boolean readyToStop = false; + + +// CONSTRUCTOR ****************************************************** + + /** + * Constructs a new server. + * + * @param port the port number on which to listen. + */ + public AbstractServer(int port) + { + this.port = port; + + this.clientThreadGroup = + new ThreadGroup("ConnectionToClient threads") + { + // All uncaught exceptions in connection threads will + // be sent to the clientException callback method. + public void uncaughtException( + Thread thread, Throwable exception) + { + clientException((ConnectionToClient)thread, exception); + } + }; + } + + +// INSTANCE METHODS ************************************************* + + /** + * Begins the thread that waits for new clients. + * If the server is already in listening mode, this + * call has no effect. + * + * @exception IOException if an I/O error occurs + * when creating the server socket. + */ + final public void listen() throws IOException + { + if (!isListening()) + { + if (serverSocket == null) + { + serverSocket = new ServerSocket(getPort(), backlog); + } + + serverSocket.setSoTimeout(timeout); + readyToStop = false; + connectionListener = new Thread(this); + connectionListener.start(); + } + } + + /** + * Causes the server to stop accepting new connections. + */ + final public void stopListening() + { + readyToStop = true; + } + + /** + * Closes the server socket and the connections with all clients. + * Any exception thrown while closing a client is ignored. + * If one wishes to catch these exceptions, then clients + * should be individually closed before calling this method. + * The method also stops listening if this thread is running. + * If the server is already closed, this + * call has no effect. + * + * @exception IOException if an I/O error occurs while + * closing the server socket. + */ + final synchronized public void close() throws IOException + { + if (serverSocket == null) + return; + stopListening(); + try + { + serverSocket.close(); + } + finally + { + // Close the client sockets of the already connected clients + Thread[] clientThreadList = getClientConnections(); + for (int i=0; iThread containing + * ConnectionToClient instances. + */ + synchronized final public Thread[] getClientConnections() + { + Thread[] clientThreadList = new + Thread[clientThreadGroup.activeCount()]; + + clientThreadGroup.enumerate(clientThreadList); + + return clientThreadList; + } + + /** + * Counts the number of clients currently connected. + * + * @return the number of clients currently connected. + */ + final public int getNumberOfClients() + { + return clientThreadGroup.activeCount(); + } + + /** + * Returns the port number. + * + * @return the port number. + */ + final public int getPort() + { + return port; + } + + /** + * Sets the port number for the next connection. + * The server must be closed and restarted for the port + * change to be in effect. + * + * @param port the port number. + */ + final public void setPort(int port) + { + this.port = port; + } + + /** + * Sets the timeout time when accepting connections. + * The default is half a second. This means that stopping the + * server may take up to timeout duration to actually stop. + * The server must be stopped and restarted for the timeout + * change to be effective. + * + * @param timeout the timeout time in ms. + */ + final public void setTimeout(int timeout) + { + this.timeout = timeout; + } + + /** + * Sets the maximum number of waiting connections accepted by the + * operating system. The default is 20. + * The server must be closed and restarted for the backlog + * change to be in effect. + * + * @param backlog the maximum number of connections. + */ + final public void setBacklog(int backlog) + { + this.backlog = backlog; + } + +// RUN METHOD ------------------------------------------------------- + + /** + * Runs the listening thread that allows clients to connect. + * Not to be called. + */ + final public void run() + { + // call the hook method to notify that the server is starting + serverStarted(); + + try + { + // Repeatedly waits for a new client connection, accepts it, and + // starts a new thread to handle data exchange. + while(!readyToStop) + { + try + { + // Wait here for new connection attempts, or a timeout + Socket clientSocket = serverSocket.accept(); + + // When a client is accepted, create a thread to handle + // the data exchange, then add it to thread group + + synchronized(this) + { + ConnectionToClient c = new ConnectionToClient( + this.clientThreadGroup, clientSocket, this); + } + } + catch (InterruptedIOException exception) + { + // This will be thrown when a timeout occurs. + // The server will continue to listen if not ready to stop. + } + } + + // call the hook method to notify that the server has stopped + serverStopped(); + } + catch (IOException exception) + { + if (!readyToStop) + { + // Closing the socket must have thrown a SocketException + listeningException(exception); + } + else + { + serverStopped(); + } + } + finally + { + readyToStop = true; + connectionListener = null; + } + } + + +// METHODS DESIGNED TO BE OVERRIDDEN BY CONCRETE SUBCLASSES --------- + + /** + * Hook method called each time a new client connection is + * accepted. The default implementation does nothing. + * @param client the connection connected to the client. + */ + protected void clientConnected(ConnectionToClient client) {} + + /** + * Hook method called each time a client disconnects. + * The default implementation does nothing. The method + * may be overridden by subclasses but should remains synchronized. + * + * @param client the connection with the client. + */ + synchronized protected void clientDisconnected( + ConnectionToClient client) {} + + /** + * Hook method called each time an exception is thrown in a + * ConnectionToClient thread. + * The method may be overridden by subclasses but should remains + * synchronized. + * + * @param client the client that raised the exception. + * @param Throwable the exception thrown. + */ + synchronized protected void clientException( + ConnectionToClient client, Throwable exception) {} + + /** + * Hook method called when the server stops accepting + * connections because an exception has been raised. + * The default implementation does nothing. + * This method may be overriden by subclasses. + * + * @param exception the exception raised. + */ + protected void listeningException(Throwable exception) {} + + /** + * Hook method called when the server starts listening for + * connections. The default implementation does nothing. + * The method may be overridden by subclasses. + */ + protected void serverStarted() {} + + /** + * Hook method called when the server stops accepting + * connections. The default implementation + * does nothing. This method may be overriden by subclasses. + */ + protected void serverStopped() {} + + /** + * Hook method called when the server is clased. + * The default implementation does nothing. This method may be + * overriden by subclasses. When the server is closed while still + * listening, serverStopped() will also be called. + */ + protected void serverClosed() {} + + /** + * Handles a command sent from one client to the server. + * This MUST be implemented by subclasses, who should respond to + * messages. + * This method is called by a synchronized method so it is also + * implcitly synchronized. + * + * @param msg the message sent. + * @param client the connection connected to the client that + * sent the message. + */ + protected abstract void handleMessageFromClient( + Object msg, ConnectionToClient client); + + +// METHODS TO BE USED FROM WITHIN THE FRAMEWORK ONLY ---------------- + + /** + * Receives a command sent from the client to the server. + * Called by the run method of ConnectionToClient + * instances that are watching for messages coming from the server + * This method is synchronized to ensure that whatever effects it has + * do not conflict with work being done by other threads. The method + * simply calls the handleMessageFromClient slot method. + * + * @param msg the message sent. + * @param client the connection connected to the client that + * sent the message. + */ + final synchronized void receiveMessageFromClient( + Object msg, ConnectionToClient client) + { + this.handleMessageFromClient(msg, client); + } +} +// End of AbstractServer Class diff --git a/code/simplechat1/ocsf/server/AdaptableServer.java b/code/simplechat1/ocsf/server/AdaptableServer.java new file mode 100644 index 0000000..24462d4 --- /dev/null +++ b/code/simplechat1/ocsf/server/AdaptableServer.java @@ -0,0 +1,129 @@ +// This file contains material supporting section 6.13 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +import java.io.*; +import java.net.*; +import java.util.*; + +/** +* The AdaptableServer is an adapter class +* that extends the AbstractServer class in place of +* the AbstractObservableServer .

+* +* Project Name: OCSF (Object Client-Server Framework)

+* +* @author Dr. Robert Laganière +* @version Febuary 2001 +*/ +class AdaptableServer extends AbstractServer +{ + //Instance variables ********************************************** + + /** + * The adapter used to simulate multiple class inheritance. + */ + private ObservableServer server; + +// CONSTRUCTORS ***************************************************** + + /** + * Constructs the server adapter. + * + * @param host the server's host name. + * @param port the port number. + */ + public AdaptableServer(int port, ObservableServer server) + { + super(port); + this.server = server; + } + +// OVERRIDDEN METHODS --------- + + /** + * Hook method called each time a new client connection is + * accepted. + * + * @param client the connection connected to the client. + */ + final protected void clientConnected(ConnectionToClient client) + { + server.clientConnected(client); + } + + /** + * Hook method called each time a client disconnects. + * + * @param client the connection with the client. + */ + final protected void clientDisconnected(ConnectionToClient client) + { + server.clientDisconnected(client); + } + + /** + * Hook method called each time an exception + * is raised in a client thread. + * + * @param client the client that raised the exception. + * @param exception the exception raised. + */ + final protected void clientException(ConnectionToClient client, + Throwable exception) + { + server.clientException(client, exception); + } + + /** + * Hook method called when the server stops accepting + * connections because an exception has been raised. + * + * @param exception the exception raised. + */ + final protected void listeningException(Throwable exception) + { + server.listeningException(exception); + } + + /** + * Hook method called when the server stops accepting + * connections. + */ + final protected void serverStopped() + { + server.serverStopped(); + } + + /** + * Hook method called when the server starts listening for + * connections. + */ + final protected void serverStarted() + { + server.serverStarted(); + } + + /** + * Hook method called when the server is closed. + */ + final protected void serverClosed() + { + server.serverClosed(); + } + + /** + * Handles a command sent from the client to the server. + * + * @param msg the message sent. + * @param client the connection connected to the client that + * sent the message. + */ + final protected void handleMessageFromClient(Object msg, + ConnectionToClient client) + { + server.handleMessageFromClient(msg, client); + } +} diff --git a/code/simplechat1/ocsf/server/ConnectionToClient.java b/code/simplechat1/ocsf/server/ConnectionToClient.java new file mode 100644 index 0000000..d8a3027 --- /dev/null +++ b/code/simplechat1/ocsf/server/ConnectionToClient.java @@ -0,0 +1,270 @@ +// This file contains material supporting section 3.8 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +import java.io.*; +import java.net.*; +import java.util.HashMap; + +/** + * An instance of this class is created by the server when a client connects. It + * accepts messages coming from the client and is responsible for sending data + * to the client since the socket is private to this class. The AbstractServer + * contains a set of instances of this class and is responsible for adding and + * deleting them. + *

+ * Project Name: OCSF (Object Client-Server Framework) + *

+ * + * @author Dr Robert Laganière + * @author Dr Timothy C. Lethbridge + * @author François Bélanger + * @author Paul Holden + * @version February 2001 (2.12) + */ +public class ConnectionToClient extends Thread { + // INSTANCE VARIABLES *********************************************** + + /** + * A reference to the Server that created this instance. + */ + private AbstractServer server; + + /** + * Sockets are used in the operating system as channels of communication + * between two processes. + * + * @see java.net.Socket + */ + private Socket clientSocket; + + /** + * Stream used to read from the client. + */ + private ObjectInputStream input; + + /** + * Stream used to write to the client. + */ + private ObjectOutputStream output; + + /** + * Indicates if the thread is ready to stop. Set to true when closing of the + * connection is initiated. + */ + private boolean readyToStop; + + /** + * Map to save information about the client such as its login ID. The + * initial size of the map is small since it is not expected that concrete + * servers will want to store many different types of information about each + * client. Used by the setInfo and getInfo methods. + */ + private HashMap savedInfo = new HashMap(10); + + // CONSTRUCTORS ***************************************************** + + /** + * Constructs a new connection to a client. + * + * @param group + * the thread groupSystem.out.println("Client at "+ client + + * "connected"); that contains the connections. + * @param clientSocket + * contains the client's socket. + * @param server + * a reference to the server that created this instance + * @exception IOException + * if an I/O error occur when creating the connection. + */ + ConnectionToClient(ThreadGroup group, Socket clientSocket, AbstractServer server) throws IOException { + super(group, (Runnable) null); + // Initialize variables + this.clientSocket = clientSocket; + this.server = server; + + clientSocket.setSoTimeout(0); // make sure timeout is infinite + + // Initialize the objects streams + try { + input = new ObjectInputStream(clientSocket.getInputStream()); + output = new ObjectOutputStream(clientSocket.getOutputStream()); + } catch (IOException ex) { + try { + closeAll(); + } catch (Exception exc) { + } + + throw ex; // Rethrow the exception. + } + + readyToStop = false; + start(); // Start the thread waits for data from the socket + } + + // INSTANCE METHODS ************************************************* + + /** + * Sends an object to the client. + * + * @param msg + * the message to be sent. + * @exception IOException + * if an I/O error occur when sending the message. + */ + final public void sendToClient(Object msg) throws IOException { + if (clientSocket == null || output == null) + throw new SocketException("socket does not exist"); + + output.writeObject(msg); + } + + /** + * Reset the output stream so we can use the same + * buffer repeatedly. This would not normally be used, but is necessary + * in some circumstances when Java refuses to send data that it thinks has been sent. + */ + final public void forceResetAfterSend() throws IOException { + output.reset(); + } + + /** + * Closes the client. If the connection is already closed, this call has no + * effect. + * + * @exception IOException + * if an error occurs when closing the socket. + */ + final public void close() throws IOException { + readyToStop = true; // Set the flag that tells the thread to stop + + try { + closeAll(); + } finally { + server.clientDisconnected(this); + } + } + + // ACCESSING METHODS ------------------------------------------------ + + /** + * Returns the address of the client. + * + * @return the client's Internet address. + */ + final public InetAddress getInetAddress() { + return clientSocket == null ? null : clientSocket.getInetAddress(); + } + + /** + * Returns a string representation of the client. + * + * @return the client's description. + */ + public String toString() { + return clientSocket == null ? null : clientSocket.getInetAddress().getHostName() + " (" + + clientSocket.getInetAddress().getHostAddress() + ")"; + } + + /** + * Saves arbitrary information about this client. Designed to be used by + * concrete subclasses of AbstractServer. Based on a hash map. + * + * @param infoType + * identifies the type of information + * @param info + * the information itself. + */ + public void setInfo(String infoType, Object info) { + savedInfo.put(infoType, info); + } + + /** + * Returns information about the client saved using setInfo. Based on a hash + * map. + * + * @param infoType + * identifies the type of information + */ + public Object getInfo(String infoType) { + return savedInfo.get(infoType); + } + + // RUN METHOD ------------------------------------------------------- + + /** + * Constantly reads the client's input stream. Sends all objects that are + * read to the server. Not to be called. + */ + final public void run() { + server.clientConnected(this); + + // This loop reads the input stream and responds to messages + // from clients + try { + // The message from the client + Object msg; + + while (!readyToStop) { + // This block waits until it reads a message from the client + // and then sends it for handling by the server + msg = input.readObject(); + server.receiveMessageFromClient(msg, this); + } + } catch (Exception exception) { + if (!readyToStop) { + try { + closeAll(); + } catch (Exception ex) { + } + + server.clientException(this, exception); + } + } + } + + // METHODS TO BE USED FROM WITHIN THE FRAMEWORK ONLY ---------------- + + /** + * Closes all connection to the server. + * + * @exception IOException + * if an I/O error occur when closing the connection. + */ + private void closeAll() throws IOException { + try { + // Close the socket + if (clientSocket != null) + clientSocket.close(); + + // Close the output stream + if (output != null) + output.close(); + + // Close the input stream + if (input != null) + input.close(); + } finally { + // Set the streams and the sockets to NULL no matter what + // Doing so allows, but does not require, any finalizers + // of these objects to reclaim system resources if and + // when they are garbage collected. + output = null; + input = null; + clientSocket = null; + } + } + + /** + * This method is called by garbage collection. + */ + protected void finalize() { + try { + closeAll(); + } catch (IOException e) { + } + } +} +// End of ConnectionToClient class diff --git a/code/simplechat1/ocsf/server/ObservableOriginatorServer.java b/code/simplechat1/ocsf/server/ObservableOriginatorServer.java new file mode 100644 index 0000000..4333694 --- /dev/null +++ b/code/simplechat1/ocsf/server/ObservableOriginatorServer.java @@ -0,0 +1,165 @@ +// This file contains material supporting the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +/** +* The ObservableOriginatorServer is a subclass +* of ObservableServer that sends +* OriginatorMessage instances to its observers. +* This class should be used when the observers need to know +* the orginator of the messages received. The originator +* is null when the message sent concerns the server. +* +* Project Name: OCSF (Object Client-Server Framework)

+* +* @author Dr Robert Laganière +* @author Dr Timothy C. Lethbridge +* @author François Bélanger +* @author Paul Holden +* @version February 2001 (2.12) +* @see ocsf.server.OriginatorMessage +*/ +public class ObservableOriginatorServer extends ObservableServer +{ + // Constructor ****************************************************** + + /** + * Constructs a new server. + * + * @param port the port on which to listen. + */ + public ObservableOriginatorServer(int port) + { + super(port); + } + + // Instance methods ************************************************ + + /** + * This method is used to handle messages coming from the client. + * Observers are notfied by receiveing an instance of OriginatorMessage + * that contains both the message received and a reference to the + * client who sent the message. + * + * @param message The message received from the client. + * @param client The connection to the client. + */ + protected synchronized void handleMessageFromClient + (Object message, ConnectionToClient client) + { + setChanged(); + notifyObservers(new OriginatorMessage(client, message)); + } + + /** + * Method called each time a new client connection is + * accepted. It notifies observers by sending an + * OriginatorMessage instance + * containing a reference to that client and + * the message defined by the static variable CLIENT_CONNECTED. + * + * @param client the connection connected to the client. + */ + protected synchronized void clientConnected(ConnectionToClient client) + { + setChanged(); + notifyObservers(new OriginatorMessage(client, CLIENT_CONNECTED)); + } + + /** + * Method called each time a client connection is + * disconnected. It notifies observers by sending an + * OriginatorMessage instance + * containing a reference to that client and + * the message defined by the static variable CLIENT_DISCONNECTED. + * + * @param client the connection connected to the client. + */ + synchronized protected void clientDisconnected(ConnectionToClient client) + { + setChanged(); + notifyObservers(new OriginatorMessage(client, CLIENT_DISCONNECTED)); + } + + + /** + * Method called each time an exception is raised + * by a client connection. + * It notifies observers by sending an + * OriginatorMessage instance + * containing a reference to that client and + * the message defined by the static variable CLIENT_EXCEPTION + * to which is appended the exception message. + * + * @param client the client that raised the exception. + * @param Throwable the exception thrown. + */ + synchronized protected void clientException( + ConnectionToClient client, Throwable exception) + { + setChanged(); + notifyObservers( + new OriginatorMessage(client, + CLIENT_EXCEPTION + exception.getMessage())); + } + + /** + * Method called each time an exception is raised + * while listening. + * It notifies observers by sending an + * OriginatorMessage instance + * containing the message defined by the static variable LISTENING_EXCEPTION + * to which is appended the exception message. + * The originator is set to null. + * + * @param exception the exception raised. + */ + protected synchronized void listeningException(Throwable exception) + { + setChanged(); + notifyObservers( + new OriginatorMessage(null, + LISTENING_EXCEPTION + exception.getMessage())); + } + + /** + * Method called each time the server is started. + * It notifies observers by sending an + * OriginatorMessage instance + * containing the message defined by the static variable SERVER_STARTED. + * The originator is set to null. + */ + protected synchronized void serverStarted() + { + setChanged(); + notifyObservers(new OriginatorMessage(null, SERVER_STARTED)); + } + + /** + * Method called each time the server is stopped. + * It notifies observers by sending an + * OriginatorMessage instance + * containing the message defined by the static variable SERVER_STOPPED. + * The originator is set to null. + */ + synchronized protected void serverStopped() + { + setChanged(); + notifyObservers(new OriginatorMessage(null, SERVER_STOPPED)); + } + + /** + * Method called each time the server is closed. + * It notifies observers by sending an + * OriginatorMessage instance + * containing the message defined by the static variable SERVER_CLOSED. + * The originator is set to null. + */ + synchronized protected void serverClosed() + { + setChanged(); + notifyObservers(new OriginatorMessage(null, SERVER_CLOSED)); + } +} diff --git a/code/simplechat1/ocsf/server/ObservableServer.java b/code/simplechat1/ocsf/server/ObservableServer.java new file mode 100644 index 0000000..5b16752 --- /dev/null +++ b/code/simplechat1/ocsf/server/ObservableServer.java @@ -0,0 +1,309 @@ +// This file contains material supporting section 6.13 of the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +import java.util.*; +import java.io.*; +import java.net.*; + +/** + * This class acts as a subclass of AbstractServer + * and is also an Observable class. + * This means that when a message is received, all observers + * are notified. + * + * @author François Bélange + * @author Dr Timothy C. Lethbridge + * @author Dr Robert Laganière + * @version August 2000 + */ + +public class ObservableServer extends Observable +{ + // Class variables ************************************************ + + /** + * The string sent to the observers when a client has connected. + */ + public static final String CLIENT_CONNECTED= "#OS:Client connected."; + + /** + * The string sent to the observers when a client has disconnected. + */ + public static final String CLIENT_DISCONNECTED= "#OS:Client disconnected."; + + /** + * The string sent to the observers when an exception occurred with a client. + * The error message of that exception will be appended to this string. + */ + public static final String CLIENT_EXCEPTION= "#OS:Client exception."; + + /** + * The string sent to the observers when a listening exception occurred. + * The error message of that exception will be appended to this string. + */ + public static final String LISTENING_EXCEPTION= "#OS:Listening exception."; + + /** + * The string sent to the observers when the server has closed. + */ + public static final String SERVER_CLOSED= "#OS:Server closed."; + + /** + * The string sent to the observers when the server has started. + */ + public static final String SERVER_STARTED= "#OS:Server started."; + + /** + * The string sent to the observers when the server has stopped. + */ + public static final String SERVER_STOPPED= "#OS:Server stopped."; + + + //Instance variables ********************************************** + + /** + * The service used to simulate multiple class inheritance. + */ + private AdaptableServer service; + + + //Constructor ***************************************************** + + /** + * Constructs a new server. + * + * @param port the port on which to listen. + */ + public ObservableServer(int port) + { + service = new AdaptableServer(port, this); + } + + //Instance methods ************************************************ + + /** + * Begins the thread that waits for new clients + */ + final public void listen() throws IOException + { + service.listen(); + } + + /** + * Causes the server to stop accepting new connections. + */ + final public void stopListening() + { + service.stopListening(); + } + + /** + * Closes the server's connections with all clients. + */ + final public void close() throws IOException + { + service.close(); + } + + /** + * Sends a message to every client connected to the server. + * + * @param msg The message to be sent + */ + public void sendToAllClients(Object msg) + { + service.sendToAllClients(msg); + } + +// ACCESSING METHODS ------------------------------------------------ + + /** + * Used to find out if the server is accepting new clients. + */ + final public boolean isListening() + { + return service.isListening(); + } + + /** + * Returns an array of containing the existing + * client connections. This can be used by + * concrete subclasses to implement messages that do something with + * each connection (e.g. kill it, send a message to it etc.) + * + * @return an array of Thread containing + * ConnectionToClient instances. + */ + final public Thread[] getClientConnections() + { + return service.getClientConnections(); + } + + /** + * @return the number of clients currently connected. + */ + final public int getNumberOfClients() + { + return service.getNumberOfClients(); + } + + /** + * @return the port number. + */ + final public int getPort() + { + return service.getPort(); + } + + /** + * Sets the port number for the next connection. + * Only has effect if the server is not currently listening. + * + * @param port the port number. + */ + final public void setPort(int port) + { + service.setPort(port); + } + + /** + * Sets the timeout time when accepting connection. + * The default is half a second. + * The server must be stopped and restarted for the timeout + * change be in effect. + * + * @param timeout the timeout time in ms. + */ + final public void setTimeout(int timeout) + { + service.setTimeout(timeout); + } + + /** + * Sets the maximum number of + * waiting connections accepted by the operating system. + * The default is 20. + * The server must be closed and restart for the backlog + * change be in effect. + * + * @param backlog the maximum number of connections. + */ + final public void setBacklog(int backlog) + { + service.setBacklog(backlog); + } + + /** + * Hook method called each time a new client connection is + * accepted. The method may be overridden by subclasses. + * + * @param client the connection connected to the client. + */ + protected synchronized void clientConnected(ConnectionToClient client) + { + setChanged(); + notifyObservers(CLIENT_CONNECTED); + } + + /** + * Hook method called each time a client disconnects. + * The method may be overridden by subclasses. + * + * @param client the connection with the client. + */ + protected synchronized void clientDisconnected(ConnectionToClient client) + { + setChanged(); + notifyObservers(CLIENT_DISCONNECTED); + } + + /** + * Hook method called each time an exception + * is raised in a client thread. + * This implementation simply closes the + * client connection, ignoring any exception. + * The method may be overridden by subclasses. + * + * @param client the client that raised the exception. + * @param exception the exception raised. + */ + protected synchronized void clientException(ConnectionToClient client, + Throwable exception) + { + setChanged(); + notifyObservers(CLIENT_EXCEPTION); + try + { + client.close(); + } + catch (Exception e) {} + } + + /** + * This method is called when the server stops accepting + * connections because an exception has been raised. + * This implementation + * simply calls stopListening. + * This method may be overriden by subclasses. + * + * @param exception the exception raised. + */ + protected synchronized void listeningException(Throwable exception) + { + setChanged(); + notifyObservers(LISTENING_EXCEPTION); + stopListening(); + } + + /** + * This method is called when the server stops accepting + * connections for any reason. This method may be overriden by + * subclasses. + */ + synchronized protected void serverStopped() + { + setChanged(); + notifyObservers(SERVER_STOPPED); + } + + /** + * This method is called when the server is closed. + * This method may be overriden by subclasses. + */ + synchronized protected void serverClosed() + { + setChanged(); + notifyObservers(SERVER_CLOSED); + } + + /** + * This method is called when the server starts listening for + * connections. The method may be overridden by subclasses. + */ + protected synchronized void serverStarted() + { + setChanged(); + notifyObservers(SERVER_STARTED); + } + + /** + * This method is used to handle messages coming from the client. + * Observers are notfied by receiveing the transmitted message. + * Note that, in this implementation, the information concerning + * the client that sent the message is lost. + * It can be overriden, but is still expected to call notifyObservers(). + * + * @param message The message received from the client. + * @param client The connection to the client. + * @see ocsf.server.ObservableOriginatorServer + */ + protected synchronized void handleMessageFromClient + (Object message, ConnectionToClient client) + { + setChanged(); + notifyObservers(message); + } +} diff --git a/code/simplechat1/ocsf/server/OriginatorMessage.java b/code/simplechat1/ocsf/server/OriginatorMessage.java new file mode 100644 index 0000000..a25d2b4 --- /dev/null +++ b/code/simplechat1/ocsf/server/OriginatorMessage.java @@ -0,0 +1,61 @@ +// This file contains material supporting the textbook: +// "Object Oriented Software Engineering" and is issued under the open-source +// license found at www.lloseng.com + +package ocsf.server; + +/** + * A message class used by the Observable layer of the OCSF in order to conserve + * information about the originator of a message. + * + * @author Dr. Robert Laganière + * @version July 2001 + */ +public class OriginatorMessage +{ + /** + * The connection that originated the message + */ + private ConnectionToClient originator; + + /** + * The message. + */ + private Object message; + +// Constructor *************************************************************** + + /** + * Constructs an instance of an OriginatorMessage + * + * @param originator The client who created this message + * @param message The contents of the message + */ + public OriginatorMessage(ConnectionToClient originator, Object message) + { + this.originator = originator; + this.message = message; + } + +// Accessor methods ********************************************************* + + /** + * Returns the originating connection. + * + * @return The connection from which the message originated. + */ + public ConnectionToClient getOriginator() + { + return originator; + } + + /** + * Returns the message's contents. + * + * @return The content of the message. + */ + public Object getMessage() + { + return message; + } +} From e5c006214f891d196cdc21ac488cf6eb71b12738 Mon Sep 17 00:00:00 2001 From: Nutan Nimkar Date: Sat, 20 Jun 2020 21:26:13 -0400 Subject: [PATCH 6/6] The file which is added to the folder contains the testcases which were tested to prove the functionality of the code and the class implementations. There were few test cases which were skipped due to not having an additional functional computer. --- code/simplechat2/OcsfPhase2.docx | Bin 0 -> 125019 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 code/simplechat2/OcsfPhase2.docx diff --git a/code/simplechat2/OcsfPhase2.docx b/code/simplechat2/OcsfPhase2.docx new file mode 100644 index 0000000000000000000000000000000000000000..f5b2bfe588e187d5a6e93ca022c70684e423d730 GIT binary patch literal 125019 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

%iWJYL`7Qs3YeRmes+| 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 V40ub1XzH;nl4%WL-A|<&y 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

D}Q6%8wVq&m8z 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