我想要一个 RMI 服务器/客户端系统,您可以在其中使用客户端浏览服务器上的文件。在这种情况下,服务器是 Debian,客户端在 Windows 上运行。
我试图让服务器持有一个File
指向当前看到的目录的对象,并List
在客户端的 a 中显示该目录中的所有文件。
问题是,当我调用返回 me 的方法时file.listFiles()
,我没有在服务器上而是在客户端上获取文件,或者FileNotFoundException
好像服务器将在客户端上运行一样。Java File
API 似乎使用运行客户端的计算机上的根目录,而不是服务器。
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,因为客户端没有此路径。希望这使它更清楚。