How to get the name of the clients connected to the server ?
843793Oct 14 2004 — edited Nov 6 2004In my final year project I am developing a messenger based on RMI. It is in the very basic stage of its development. Now i have got some problem . I want to get the names of all the clients connected to the server when a client gets connected. I could send the name of the client currently connected to all who r already connected but cant get all the names who r connected . Eventually wat happens is that the client who first gets connected has all the name of the client but the ls client can see that only he is connected.
How to solve this . I am sending all the code listing so that u can test and actually run the project.
MessageServer.java
========================
import java.rmi.Remote;
import java.rmi.RemoteException;
import message.*;
public interface MessageServer extends Remote
{
static String SERVER_NAME = "Message_Server";
static int FAILURE = -1;
static int SUCCESS = 0;
void send(String name, String s) throws RemoteException;
void sendMe(String name) throws RemoteException;
void getWhoIsConnected(MessageReceiver m) throws RemoteException;
int register(String name, MessageReceiver m)
throws RemoteException;
}
MessageReceiver.java
=======================
package message;
import java.rmi.*;
public interface MessageReceiver extends Remote
{
void print(String s) throws RemoteException;
void printConnected(String s) throws RemoteException;
}
Server.java
=======================
import java.util.Enumeration;
import java.util.Hashtable;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import message.*;
public class Server extends UnicastRemoteObject
implements MessageServer
{
// Add a hashtable to track registered clients.
static Hashtable receivers = new Hashtable(5);
public Server() throws RemoteException
{
super();
}
public void send(String name, String message) throws RemoteException
{
// Iterate through the registered clients.
for (Enumeration e = receivers.elements() ; e.hasMoreElements() ;)
{
MessageReceiver m = (MessageReceiver)e.nextElement();
// All messageReceivers implement print.
m.print(name + ": " + message);
}
}
//Shows guys who r connected
public void sendMe(String name) throws RemoteException
{
// Iterate through the registered clients.
for (Enumeration e = receivers.elements() ; e.hasMoreElements() ;)
{
MessageReceiver m = (MessageReceiver)e.nextElement();
// All messageReceivers implement print.
m.printConnected(name);
}
}
// ~~~~~~~~~~ Got problem with this method ~~~~~~~~~~~~~~~~
public void getWhoIsConnected(MessageReceiver m) throws RemoteException
{
// Iterate through the registered clients.
for (Enumeration e = receivers.elements() ; e.hasMoreElements() ;)
{
//MessageReceiver m = (MessageReceiver);
// All messageReceivers implement print.
m.printConnected(e.toString());
}
}
public int register(String name, MessageReceiver m)
{
int retval = MessageServer.FAILURE;
// Don’t register a null client.
if((name !=null) && (m != null))
{
// Only add a client with a unique name.
if(receivers.get(name) == null)
{
// Add client to hash table.
receivers.put(name,m);
System.out.println("Added " + name);
retval = MessageServer.SUCCESS;
}else
{
System.out.println(
"Could not add client because " + name +
" already exists on server.");
}
}
return retval;
}
public static void main(String[] args)
{
System.setSecurityManager(
new RMISecurityManager());
try
{
// Create an instance of the server.
MessageServer srv = new Server();
// Bootstrap registry
Registry reg = LocateRegistry.createRegistry(
Registry.REGISTRY_PORT);
reg.rebind(MessageServer.SERVER_NAME, srv);
// Bind server to local registry on default port
// Naming.rebind(MessageServer.SERVER_NAME, srv);
System.out.println("Server bound and started");
} catch (Exception e)
{
System.err.println("Server exception: " +
e.getMessage());
e.printStackTrace();
}
}
}
Client.java
==========================
import java.awt.*;
import java.awt.event.*;
import java.rmi.*;
import java.rmi.server.*;
import message.*;
public class Client extends Frame implements MessageReceiver,ActionListener, WindowListener
{
TextField tf; // Message text field
TextArea ta; // Message server output text area
TextArea connected;
static String name; // name of this client
static MessageServer server; //Connection to the server
public Client() throws RemoteException
{
setTitle(name);
setLayout(new BorderLayout());
tf = new TextField(30);
tf.addActionListener(this);
add("South",tf);
ta = new TextArea(20,20);
add("Center",ta);
connected = new TextArea(20,10);
add("East",connected);
addWindowListener(new WindowCloser());
UnicastRemoteObject.exportObject(this);
}
public void windowOpened(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public static void main(String args[])
{
name = args[0];
System.setSecurityManager(new RMISecurityManager());
try
{
Client cf = new Client();
cf.pack();
cf.show();
server = (MessageServer)Naming.lookup(MessageServer.SERVER_NAME);
int s = server.register(args[0],cf);
server.sendMe(args[0]);
//server.getWhoIsConnected(cf); Not calling this method ..If I do some strange things r happening
if(s == MessageServer.FAILURE)
throw new Exception("Couldn’t connect to server");
} catch (Exception e)
{
System.err.println("Client exception: " + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
}
public void actionPerformed(ActionEvent ae)
{
try
{
server.send(name,tf.getText());
} catch (Exception e)
{
System.err.println("Client exception: " + e.getMessage());
e.printStackTrace();
}
tf.setText("");
tf.selectAll();
}
public void print(String s)
{
ta.append(s + "\n");
}
public void printConnected(String s)
{
connected.append(s + "\n");
}
}
class WindowCloser extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
Window win = e.getWindow();
win.setVisible(false);
System.exit(0);
}
}
server.policy
-===================
grant
{
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.lang.RuntimePermission "setSecurityManager";
permission java.lang.RuntimePermission "createSecurityManager";
};
Now how to run .. may be redundant but still i am supplying it to avoide confusion
1. Copy all the file in a directory
2. Compile MessageServer.java using "javac".
3. Put MessageReceiver.class in a directory <message> and compile.
4. Compile Client.java and Server.java.
5. now execute : "rmic Server" and then "rmic Client" ... this will stub and skeleton for Server and Client.
6. run server : start java -Djava.security.policy=server.policy server
7. run client : start java -Djava.security.policy=server.policy Client suman
8. run another client : start java -Djava.security.policy=server.policy Client suma1
Now see the result
suman will receive that suma1 has beed added but how to notify suma1 that suman is already logged in?