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