PROGRAM 2
// Chat.idl module Chat { interface ChatClientServices { void printMessage (in string message); }; interface ChatServerServices { boolean register (in string clientName, in ChatClientServices clientServices); boolean chatPublic (in string sender, in string message); boolean chatPrivate (in string sender, in string receiver, in string message); boolean unregister (in string clientName); }; }; // ChatClient.java import Chat.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; import java.io.*; public class ChatClient { public static void main (String args []) { try { // Create and initialize the ORB ORB orb = ORB.init (args, null); // Get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references ("NameService"); NamingContext ncRef = NamingContextHelper.narrow (objRef); // Resolve the Object Reference in Naming NameComponent nc = new NameComponent ("Chat", ""); NameComponent path [] = {nc}; ChatServerServices chatServerServices = ChatServerServicesHelper.narrow (ncRef.resolve (path)); ChatClientServicesImplementation chatClientServices = new ChatClientServicesImplementation (); orb.connect (chatClientServices); // Enter client's name InputStreamReader inputReader = new InputStreamReader (System.in); BufferedReader bufferedReader = new BufferedReader (inputReader); System.out.print ("Enter name: "); String name = bufferedReader.readLine (); // Register client while (! chatServerServices.register (name, chatClientServices)) { System.out.print ("This name is already taken. Enter another name: "); name = bufferedReader.readLine (); } // Enter private or public chat System.out.print ("Enter a specific name for a private chat or 'public' for a public chat: "); String type = bufferedReader.readLine (); String name2 = type; // Get message and chat while (true) { // Get msg from client String msg = bufferedReader.readLine (); msg = name + "> " + msg; // Unregister client if msg = "exit" if (msg.compareTo (name + "> " + "exit") == 0) { break; } // Private and public chat if (type.compareTo ("public") == 0) { if (! chatServerServices.chatPublic (name, msg)) { System.out.println (name + "> No one is on-line"); } } else { if (! chatServerServices.chatPrivate (name, name2, msg)) { System.out.println (name + "> " + name2 + " is not on-line"); } } } chatServerServices.unregister (name); } catch (Exception e) { System.out.println ("Error: " + e) ; e.printStackTrace (System.out); } } } // ChatClientServicesImplementation.java class ChatClientServicesImplementation extends _ChatClientServicesImplBase { // Constructor public ChatClientServicesImplementation () { } // Print message public void printMessage (String msg) { System.out.println (msg); } } // ChatServer.java import Chat.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import java.util.*; public class ChatServer { public static void main (String args []) { try { // Create and initialize the ORB ORB orb = ORB.init (args, null); // Create servant and register it with the ORB ChatServerServicesImplementation chatServerServices = new ChatServerServicesImplementation (); orb.connect (chatServerServices); // Get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references ("NameService"); NamingContext ncRef = NamingContextHelper.narrow (objRef); // Bind the Object Reference in Naming NameComponent nc = new NameComponent ("Chat", ""); NameComponent path [] = {nc}; ncRef.rebind (path, chatServerServices); // Wait for invocations from clients java.lang.Object sync = new java.lang.Object (); synchronized (sync) { sync.wait (); } } catch (Exception e) { System.err.println ("Error: " + e); e.printStackTrace (System.out); } } } // ChatServerServicesImplementation.java class ChatServerServicesImplementation extends _ChatServerServicesImplBase { private Hashtable clientServicesList; // Constructor public ChatServerServicesImplementation () { clientServicesList = new Hashtable (); } // Register clients public boolean register (String clientName, ChatClientServices clientServices) { if (! clientServicesList.containsKey (clientName)) { clientServicesList.put (clientName, clientServices); return true; } else { return false; } } // Public chat public boolean chatPublic (String sender, String msg) { Enumeration e = clientServicesList.elements (); if (clientServicesList.size () == 1 && clientServicesList.containsKey (sender)) { return false; } else { while (e.hasMoreElements ()) { ChatClientServices client = (ChatClientServices) e.nextElement (); client.printMessage (msg); } } return true; } // Private chat public boolean chatPrivate (String sender, String receiver, String msg) { ChatClientServices client2 = (ChatClientServices) clientServicesList.get (receiver); if (client2 != null) { client2.printMessage (msg); } else { return false; } ChatClientServices client1 = (ChatClientServices) clientServicesList.get (sender); if (client1 != null) { client1.printMessage (msg); } return true; } // Unregister clients public boolean unregister (String clientName) { if (clientServicesList.containsKey (clientName)) { clientServicesList.remove (clientName); return true; } else { return false; } } } // Chat.out // Client 1 Enter name: Anthony Enter a specific name for a private chat or 'public' for a public chat: public Hello, Stacey! Anthony> Hello Stacey! Stacey> Hello Anthony! exit // Client 2 Enter name: Stacey Enter a specific name for a private chat or 'public' for a public chat: public Anthony>Hello, Stacey! Hello, Anthony! Stacey> Hello, Anthony! exit
BACK TO CS6580 PAGE.