我正在尝试建立一个简单的RMI实现,但我遇到了一些麻烦。
服务器启动正常,但客户端似乎永远不会找到远程对象(Naming.lookup
每次都失败)。从阅读开始,人们已经提到将远程对象(Bank)存储在静态变量中,但这也没有用。
更新:如果我删除所有对端口号的引用,整个过程似乎工作正常。有谁知道为什么会这样?
服务器
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 Bank 7777
java ATM localhost 7777 testMethod
答案 0 :(得分:1)
您通过不使用绑定字符串中的端口号在其默认端口上运行注册表并绑定到该注册表,但您在端口7777上查找不存在的注册表。绑定字符串和查找字符串应该相同。
NB查找与连接相同。在调用其中一个远程方法之前,没有与远程对象的连接。