1

クライアントを使用してサーバー上のファイルを参照できるRMIサーバー/クライアントシステムが必要です。この場合、サーバーはDebianであり、クライアントはWindows上で実行されます。

File現在表示されているディレクトリを指すオブジェクトをサーバーに保持させ、そのディレクトリ内のすべてのファイルをListクライアントに表示しようとしました。

問題は、私が返すメソッドを呼び出すとfile.listFiles()、サーバーではなくクライアントでファイルを取得するFileNotFoundExceptionか、サーバーがクライアントで実行されるかのように取得することです。Java FileAPIは、サーバーではなく、クライアントが実行されているコンピューターのルートディレクトリを使用しているようです。

もっと簡単に言うと、サーバーのファイルシステムを表示するクライアントのファイルエクスプローラーが必要です。

編集:

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 に答える