The applet on the client, (ClientStarter) contains a text field and a button for entering the message to transmit to other clients.
Another text field contains the IP listing of presently registered Clients on the server.
The applet init is like this:
public void init(){
try{
LocateRegistry.createRegistry(1099);
client =new PopupClientImpl();
Naming.rebind("/ClientPopup",client);
System.out.println("Client bound");
server =(PopupServerInterface)Naming.lookup("rmi://"
+getCodeBase().getHost()+":5000/ServerPop");
server.addUser((PopupClientInterface)client);
System.out.println("Client registered on server");
}catch(Exception e){
System.out.println(e);
}
}
This starts an instance of the rmiregistry on the client on the default port 1099 and binds an instance of the PopupClientImpl to it.
It also queries the registry on the server from which it was loaded to locate the object that was registered with the name "ServerPop" (an instance of PopupServerImpl).
The applet then looks up the server and registers itself (an instance of PopupClientImpl) there, so that other clients know it has come up by invoking a remote method on the server.
Notice that all objects have been cast to their interfaces.
Interfaces provide an implementation-free method for a client to access the servers published methods.
That is, when deploying the client applications, the interface file is all that is needed to make the remote call.
In the start() method of the applet the significant piece of code is:
Vector v = server.getUsers();
for(int i=0;i<v.size();i++){
String info =((PopupClientInterface)v.elementAt(i)).getInfo();
userlist.append(info+ "\n");
}
This queries the already-located PopupServerImpl on the server for a listing of all the present users.
The getUsers() method returns a vector containing all the client references (registered earlier onto the server in their individual init() methods).
Each one of these registered client objects is then queried for some information (an IP address here) by getInfo() which is displayed in a text area.
We also add a button, and an anonymous inner class handles the button clicks.
When the button is pressed, another remote method is invoked on the server object and the text in the textarea is sent as a message to all clients.
Button but = new Button("Send Message");
but.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
server.sendMessage(ta.getText()); // Invoke remote method
}catch(Exception excep){
ta.setText(excep.toString());
}
}
}
);
add(but); //Add the button with its event handler onto the applet.
The point worth noting here is that by invoking getInfo() on all the clients from within a client, the applets are not contacted directly.
Rather it is the object reference on the server which is queried for its state information.
Sameer Tyagi is a Software Engineer with several years of programming experience in iNet application development and has conducted multiple training workshops in Java. Besides holding an Engineering degree in Electronics he is a Sun Certified Java 1.1 Programmer.
Email: sameertyagi@usa.net
JavaBytes
Internet Cyclone
This powerful, easy-to-use, internet optimizer is for
Windows 95, 98, ME, NT, 2000 and XP. It's designed to
automatically optimize your Windows settings, boosting your
Internet connection up to 200%.
Blackmail Applet
This applet prints out text that looks like letters cut out of a
newspaper. You can specify the text, the width and height of the
applet and the delay after each letter. Future versions will
have more parameters.
While surveys suggest that small businesses aren't prepared for ever-present security dangers, this Boston-area printer has maintained a pristine operation since a scare six years ago.