Как просмотреть файловую систему диска сервера RMI с java.io.File? - PullRequest
1 голос
/ 16 декабря 2011

Я хочу RMI сервер / клиентскую систему, где вы можете просматривать файлы на сервере с клиентом. В этом случае сервер является Debian, а клиент работает в Windows.

Я пытался заставить сервер удерживать объект File, указывающий на текущий видимый каталог, и показывать все файлы в этом каталоге в List на клиенте.

Проблема в том, что когда я вызываю метод, возвращающий мне file.listFiles(), я не получаю файлы на сервере, но на клиенте или FileNotFoundException, как если бы сервер работал на клиенте. Java File API, похоже, использует корневые каталоги на компьютере, на котором работает клиент, а не на сервере.

Проще сказать: я хочу, чтобы файл-клиент на клиенте показывал мне файловую систему сервера.

Edit:

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, потому что у клиента нет этого пути. Надеюсь, что это еще яснее.

1 Ответ

2 голосов
/ 17 декабря 2011

File не является удаленным объектом.Что бы это ни говорило, сервер применяется на сервере.Вы можете отправить его клиенту через RMI, так как он сериализуем, и он не принимает никакого внешнего состояния, такого как состояние файловой системы сервера.

...