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.