import java.rmi.*;
/**
* Java Chat - A simple chatroom application - Client Class.
*
* This is the client class. It's responsible for instigating a
* connection with the server and setting the username as well
* as general communication between user and server. In addition,
* it launches the GUI object silently.
*
* @author Sean Handley
* @version November, 2006
*/
public class ChatClient
{
private Callback returnComms;
private IChatServer serverObject;
private String userName;
private boolean loggedIn;
private ClientGUI gui;
private final String defaultUsername = "User1";
/**
* Main entry point for the client. Instanciates the client with
* command-line arguments as specified by the user. This will always
* include a server URI and optionally a username.
*
* @param args
*/
public static void main (String args[])
{
if (args.length < 1)
{
System.out.println("usage: java ChatClient <server address> [username]");
}
else if(args.length < 2)
{
ChatClient cc = new ChatClient(args[0]);
cc.toString(); //removes a compiler warning about local usage
}
else if(args.length < 3)
{
ChatClient cc = new ChatClient(args[0],args[1]);
cc.toString(); //removes a compiler warning about local usage
}
}
/**
* Constructor with only the URI. Adds in a default user name and
* calls the main 2-parameter constructor.
*
* @param serverAddress
*/
public ChatClient(String serverAddress)
{
ChatClient cc = new ChatClient(serverAddress,defaultUsername);
cc.toString(); //removes a compiler warning about local usage
}
/**
* Constructor for the chat client.
*
* @param serverAddress
* @param userName
*/
public ChatClient(String serverAddress, String userName)
{
this.userName = userName;
loggedIn = false;
//start building the GUI silently
gui = new ClientGUI(this);
//(pass a copy of _this_ so controls can invoke methods.
new Thread(gui).start();
Remote remoteObject;
// Set up a security manager
System.setSecurityManager(new RMISecurityManager());
try
{
String name = "rmi://" + serverAddress + "/CHAT-SERVER";
remoteObject = Naming.lookup(name);
serverObject = (IChatServer)remoteObject;
returnComms = new Callback(serverObject, gui,userName);
}
catch(java.rmi.ConnectException e)
{
System.out.println("FATAL ERROR: Could not connect to server.");
System.exit(1);
}
catch (Exception e)
{
System.out.println("General error: " + e.toString());
System.exit(1);
}
//now that all is well, it's safe to show the GUI
gui.showGUI();
}
/**
* Change the username and perform the necessary related operations.
*
* @param newName
* @throws java.rmi.RemoteException
*/
public void changeName(String newName) throws RemoteException
{
removeClient();
String oldName = userName;
userName = newName;
returnComms.setUsername(userName);
addClient();
gui.setTitle(gui.windowTitle + " [" + userName + "]");
announceNameChange(oldName, newName);
}
/**
*
* Test if client is logged in.
*
* @return flag
*/
public boolean isLoggedIn()
{
return loggedIn;
}
/**
* Changed logged in status.
*
* @param status
*/
public void setLoggedIn(boolean status)
{
loggedIn = status;
}
/**
* Change the username and pass on the new name to the
* gui's title.
*
* @param userName
*/
public void setUserName(String userName)
{
this.userName = userName;
gui.setTitle(gui.windowTitle + " [" + userName + "]");
}
/**
* Return the username.
*
* @return username
*/
public String getUserName()
{
return userName;
}
/**
* Send a new message to the server using a threaded
* transaction.
*
* @param msg
*/
public void sendMessage(String msg)
{
MessageTransaction mc = new MessageTransaction(serverObject,msg);
new Thread(mc).start();
}
/**
* Calls the server method for leaving.
*
* @throws java.rmi.RemoteException
*/
public void leave() throws RemoteException
{
serverObject.leave(userName);
}
/**
* Calls the server's check user method.
*
* @param username
* @return flag
* @throws java.rmi.RemoteException
*/
public boolean checkUser(String username) throws RemoteException
{
return serverObject.checkUser(username);
}
/**
* Calls the server's disconnect method and updates the gui's
* userlist.
*
* @throws java.rmi.RemoteException
*/
public void removeClient() throws RemoteException
{
serverObject.removeClient(returnComms);
gui.updateUserList(serverObject.getUsers());
}
/**
* Calls the server's connect method.
*
* @return true if the user was added successfully, false otherwise
* @throws java.rmi.RemoteException
*/
public boolean addClient() throws RemoteException
{
returnComms.setUsername(userName); //update the username in the callback object
return serverObject.addClient(returnComms);
}
/**
* Calls the server's announce method and updates the
* gui's user list.
*
* @throws java.rmi.RemoteException
*/
public void announce() throws RemoteException
{
serverObject.announce(userName);
gui.updateUserList(serverObject.getUsers());
}
/**
* Calls the server's announceNameChange method.
*
* @param newName
* @throws java.rmi.RemoteException
*/
public void announceNameChange(String oldName, String newName) throws RemoteException
{
serverObject.announceNameChange(oldName, newName);
}
}