package example.rmi;
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
...
public class ChatRoomImp extends UnicastRemoteObject implements ChatRoom {
   private java.util.Hashtable users =null;
   private boolean clearFailedUsers =true;
   ...

   public synchronized void distributeMessage(Message message){*1*
      Vector failedUsers =new Vector();
      for (Enumeration e =users.keys();e.hasMoreElements();){
            String userName =(String)e.nextElement();
         User user =(User)users.get(userName);
         try {
            user.receiveMessage(message);
         }catch (RemoteException ex){
            failedUsers.addElement(userName);
         }
      }
      if (!clearFailedUsers)return;

      clearFailedUsers =false;
      for (Enumeration e=failedUsers.elements();e.hasMoreElements();){
         leave((String)e.nextElement());
      }
      clearFailedUsers =true;
   }

   public synchronized void leave(String userName){
      Message message =new UserLeftMessage(userName);
      distributeMessage(message);
      users.remove(userName);
   }
   ...

   public tatic void main(String []args){
      if (args.length <1){
         System.out.println(«Required argument:»);
         return;

      }
      try {
         Naming.rebind(«rmi://localhost/»+args [0 ],
            new ChatRoomImp());
         *2*
      }catch (java.net.MalformedURLException e){
         e.printStackTrace();
      }catch (RemoteException e){
         e.printStackTrace();
      }
   }
}