1

我想要一个 RMI 服务器/客户端系统,您可以在其中使用客户端浏览服务器上的文件。在这种情况下,服务器是 Debian,客户端在 Windows 上运行。

我试图让服务器持有一个File指向当前看到的目录的对象,并List在客户端的 a 中显示该目录中的所有文件。

问题是,当我调用返回 me 的方法时file.listFiles(),我没有在服务器上而是在客户端上获取文件,或者FileNotFoundException好像服务器将在客户端上运行一样。Java FileAPI 似乎使用运行客户端的计算机上的根目录,而不是服务器。

Simpler 说:我想要客户端上的文件浏览器向我展示服务器文件系统。

编辑:

public class ClientMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        View view = new View();
        view.setVisible(true);
        try {
            String name = "Remote";
            Registry registry = LocateRegistry.getRegistry("127.0.0.1");
            IRemote model = (IRemote) registry.lookup(name);
            view.setModel(model);
            view.update();
        } catch (Exception e) {
            System.err.println("Remote Exception");
            e.printStackTrace();
        }
    }

}

public class View extends JFrame implements IView{
    JList list;
    IRemote model;
    public View() {
        super();
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        list = new JList();
        this.add(list);
    }
    public IRemote getModel() {
        return model;
    }
    public void setModel(IRemote model) {
        this.model = model;
    }

    public void update(){
        try {
            this.list.setListData(model.getFileList());
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


public interface IRemote extends Remote {
    public String[] getFileList() throws RemoteException;
}

public class Model implements IRemote{
    File current;

    public Model() {
        super();
        current = new File(".");
    }

    public String[] getFileList() {
        return current.list();
    }

    public void setCurrentDirectory(String current) {
        this.current = new File(current);
    }




}
public class ServerMain {
    public static void main(String[] args) {
        new ServerMain();
    }

    public ServerMain() {
        super();
        Model model = new Model();
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Remote";
            IRemote stub = (IRemote) UnicastRemoteObject.exportObject(model, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.rebind(name, stub);
        } catch (Exception e) {
            System.err.println("Controller exception:");
            e.printStackTrace();
        }
    }


}

这就是我想要做的。在这里,服务器将模型绑定到注册表。客户端查找模型,将模型提供给视图,视图从模型调用 getFileList()。用“。” 文件我得到程序所在的目录。因为它是相对的,所以我得到了运行客户端程序的客户端上的所有文件。如果我使用非相对目录,我会收到 FileNotFoundException,因为客户端没有此路径。希望这使它更清楚。

4

1 回答 1

2

File不是远程对象。它告诉服务器的任何内容都适用于服务器。您可以通过 RMI 将它发送到客户端,因为它是可序列化的,并且它不带任何外部状态,例如服务器文件系统的状态。

于 2011-12-17T07:19:00.770 回答