Java中的Rmi - 需要修改的聊天应用程序,但如何?

时间:2017-06-07 19:10:48

标签: java eclipse sockets rmi

我已经制作了java RMI应用程序 - 聊天。

聊天班:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

ChatClient类:

public class Chat extends UnicastRemoteObject implements ChatInterface  {

    public String name;
    public ChatInterface client=null;

    public Chat(String n)  throws RemoteException { 
        this.name=n;   
    }
    public String getName() throws RemoteException {
        return this.name;
    }

    public void setClient(ChatInterface c){
        client=c;
    }

    public ChatInterface getClient(){
        return client;
    }

    public void send(String s) throws RemoteException{
        System.out.println(s);
    }   
}

ChatInterface界面:

    import java.rmi.*;
    import java.rmi.server.*;
    import java.util.*;

    public class ChatClient {
        public static void main (String[] argv) {
            try {
                System.setProperty("java.rmi.server.hostname","127.0.0.1");
                System.setSecurityManager(new RMISecurityManager());
                Scanner s=new Scanner(System.in);
                System.out.println("Enter Your name and press Enter:");
                String name=s.nextLine().trim();
                ChatInterface client = new Chat(name);
                ChatInterface server = (ChatInterface)Naming.lookup("rmi://localhost/ABC");
                String msg="["+client.getName()+"] got connected";
                server.send(msg);
                System.out.println("[System] Chat Remote Object is ready:");
                server.setClient(client);

                while(true){
                    msg=s.nextLine().trim();
                    msg="["+client.getName()+"] "+msg;                  
                    server.send(msg);
                }

            }catch (Exception e) {
                System.out.println("[System] Server failed: " + e);
            }
        }
    }

ChatServer类:

public interface ChatInterface extends Remote{
    public String getName() throws RemoteException;
    public void send(String msg) throws RemoteException;
    public void setClient(ChatInterface c)throws RemoteException;
    public ChatInterface getClient() throws RemoteException;
}

聊天 - 两个项目中的代码相同

ChatInterface - 两个项目中的代码相同

ChatClient - ChatServer - 它们具有不同的代码

看起来像这样:How it looks inside Eclipse (hierarchy)

问题是,这个聊天有点像...... 我们收到了所有消息(如整个历史记录)但是当用户发送新消息时。 例如,我们有user1,user2,user3。

  • User1发送消息:' FUN !!!'
  • User2和User3什么也看不见。
  • User2发送" okkk"
  • 现在,user1只能看到" FUN !!!"
  • 用户2看到"有趣!!!"和" okkk"

User3什么都没看到,因为没有发送任何消息,所以什么都没有。

那很糟糕:/。它就像用户必须发送一些东西来获取消息。即使只是"空间",但仍然是一些东西。否则他不会得到任何消息。

我需要将其设置为在一个用户发送新消息时自动发送所有用户。喜欢"更新"。'

它必须像

  • User1什么都没有
  • User2什么都没有
  • User3什么都没有
  • 用户3发送' AAAA'
  • 现在所有用户都有AAAA'

1 个答案:

答案 0 :(得分:1)

public interface ChatInterface extends Remote{
    public String getName() throws RemoteException;
    public void send(String msg) throws RemoteException;
    public void setClient(ChatInterface c)throws RemoteException;
    public ChatInterface getClient() throws RemoteException;
}

问题从这里开始。 setClient()的本质是服务器一次只能知道一个客户端。当然,服务器应该有列表的客户端,方法应该是addClient(ChatInterface c)

getClient()作为一种远程方法的目的使我望而却步。