My dear friend.
Actually there is no need to use two different port for same application.
In order to create chat application in RMi, just gather the reference of each client in an Vector or LinkedList or any other data structure you feel feasible.
Then loop your message through all the clients using the LinkList, which will broadcast the message to all the clients.
I am damn sure this would workout as I have implemented the same in my chat application.
All the best.
ChatClient.java
import java.rmi.*;
public interface ChatClient1 extends Remote
{
public void receive (
String s,String username,String IPAdd) throws RemoteException;
public void popUp(boolean flag,String uname) throws RemoteException;
}
ChatClientImpl.java
import java.net.InetAddress;
import java.rmi.*;
import java.util.Hashtable;
import java.util.Scanner;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class ChatClientImpl1 extends PortableRemoteObject implements ChatClient1, Runnable {
private boolean flag,check=false;
private ChatServer1 server;
private Vector uName = new Vector();
private String username,password,IPAddress,msg="hello",receiverIP,receiverUname;
//private static
Thread thread=null;
public ChatClientImpl1 (ChatServer1 cs) throws RemoteException {
try {
server = cs;
InetAddress inet = InetAddress.getLocalHost();
IPAddress = inet.getHostAddress();
System.out.println("Client::" + inet.getHostAddress());
System.out.println("Username::");
Scanner sc = new Scanner(System.in);
username = sc.nextLine();
System.out.println("Password::");
password = sc.nextLine();
flag=server.userLogin(this, username, password, inet.getHostAddress());
if(flag == true){
System.out.println("Either Login Failed OR " +username+" is already logged in.");
server.userLogout(username);
System.exit(1);
}
uName=server.getUsers();
System.out.println("\nUsers currently online::");
for(int i=0;i<uName.size();i++){
System.out.println(uName.get(i).toString());
}
System.out.println("\nEnter name of user with whom you want to chat:::");
if(sc.hasNext()) {
receiverUname = sc.nextLine();
}
else {
server.userLogout(username);
System.out.println(username+" has logged out.");
sc.close();
System.exit(1);
}
while(check == false){
uName=server.getUsers();
System.out.println("\nUsers currently online::");
for(int j=0;j<uName.size();j++){
System.out.println(uName.get(j).toString());
if(receiverUname.equals(uName.get(j).toString())){
check=true;
break;
}
}
if(check == true){
break;
}else {
System.out.println("User is not online.");
System.out.println("Please enter some other user name:");
receiverUname = sc.nextLine();
}
}
receiverIP=server.getUserInfo(receiverUname);
System.out.println("\nEnter text to Chat : ");
}catch (Exception ex) {
System.out.println("We have encountered a problem,please login again.");
}
}
public synchronized void receive(String s,String user,String IP) throws RemoteException {
System.out.println(user+"::"+s);
}
public synchronized void popUp(boolean flag, String uname) throws RemoteException{
if(flag==true){
System.out.println(uname+" is now online");
}else{
System.out.println(uname+" is now offline");
}
}
public void run(){
Scanner in=new Scanner(System.in);
while(!msg.equals("exit")){
try{
if(in.hasNext())
msg=in.nextLine();
else{
server.userLogout(username);
System.out.println(username+" has logged out.");
in.close();
System.exit(1);
}
server.sendMessage(msg,username,IPAddress,receiverIP);
if(msg.equals("exit"))
{
server.userLogout(username);
System.out.println(username+" has logged out.");
in.close();
System.exit(1);
}
}catch(Exception e){
System.out.println("Server is encountering some problems, please login again.");
}
}
}
public static void main (String[] args){
try{
String str1 = args[0];
String s1 = "iiop://" + str1 + ":1050";
Hashtable hash = new Hashtable();
hash.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
hash.put("java.naming.provider.url", s1);
Context con = new InitialContext(hash);
Object obj = con.lookup("ChatServer");
ChatServer1 cs = (ChatServer1) PortableRemoteObject.narrow(obj,ChatServer1.class);
new Thread(new ChatClientImpl1(cs)).start();
}catch (Exception e){
System.out.println("Server is encountering some problems, please login again.");
}
}
}
With Regards,
Sunil Parmar
GET Java Team,
Hrut Infotech.
sunil04ce@gmail.com