【发布时间】:2014-09-25 14:51:02
【问题描述】:
我正在尝试设置一个简单的 RMI 实现,但遇到了一些麻烦。
服务器启动正常,但客户端似乎永远找不到远程对象(Naming.lookup 每次都失败)。从阅读中人们提到将远程对象(银行)存储在静态变量中,但这也没有奏效。
更新:如果我删除对端口号的所有引用,整个事情似乎工作正常。有谁知道这是为什么?
服务器:
public class Bank extends UnicastRemoteObject implements BankInterface {
public static void main(String args[]) throws Exception {
try{
System.setSecurityManager(new SecurityManager());
System.out.println("Security Manager set.");
Bank myBank = new Bank(Integer.parseInt(args[0]));
System.out.println("Bank instance created");
Naming.rebind("Bank", myBank);
System.out.println("Name rebind completed.");
System.out.println("Server ready for requests!");
}catch(Exception e){
System.out.println("Error in main - " + e.toString());
}
}
}
客户
public class ATM {
public static void main (String args[]) throws Exception {
String URL = "//" + args[0] + ":" + args[1] + "/Bank";
System.out.println("Connecting to: " + URL);
BankInterface bank = (BankInterface)Naming.lookup(URL);
System.out.println("Connected!");
}
}
堆栈跟踪
Exception in thread "main" java.rmi.NoSuchObjectException: no such object in tab
le
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Stream
RemoteCall.java:276)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:
253)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at ATM.main(ATM.java:8)
我从 cmd.exe 运行的命令是:
rmiregistry
java 银行 7777
java ATM 本地主机 7777 测试方法
【问题讨论】:
-
你不应该将变量“URL”大写,因为存在一个名为
java.net.URL的类