Java RMI的导入/包问题
我有两个软件包客户端和服务器端: 客户端包包含一个接口“I_对象”: 和一个类主客户端:Java RMI的导入/包问题,java,rmi,Java,Rmi,我有两个软件包客户端和服务器端: 客户端包包含一个接口“I_对象”: 和一个类主客户端: package client; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * * @author marwen */ public class main_client {
package client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
*
* @author marwen
*/
public class main_client {
public static void main(String [] args) throws NotBoundException, MalformedURLException, RemoteException{
I_object obj_distant=(I_object) Naming.lookup("rmi://localhost:1000/exemple");
System.out.println(obj_distant.Add(5, 9));
}
}
服务器包包含一个类(impl_对象),该类实现接口I_对象:
package client;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface I_object extends Remote {
public int Add(int a,int b) throws RemoteException;
}
package server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
*
* @author marwen
*/
public class impl_object extends UnicastRemoteObject implements I_object {
public impl_object() throws RemoteException
{}
public int Add(int a,int b) throws RemoteException{
return a+b;
}
}
最后是一个主服务器:
package server;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class main_server {
public static void main(String [] args) throws NotBoundException, MalformedURLException, RemoteException{
impl_object obj=new impl_object();
java.rmi.registry.LocateRegistry.createRegistry(1000);
Naming.rebind("rmi://localhost:1000/exemple", obj);
System.out.println("server is running");
}
}
如果您注意到在“impl_对象”的实现中,我没有放置“import client.i_对象”;为什么???????
好的,准确地说,如果我将“import client.I_object;”放在客户端包中,那么服务器将“链接”到客户端!!!这就是问题所在,当我将客户机和服务器分开时(我将服务器放在远程计算机上,而客户机放在家里)???。。。。
有人能给我解释一下,我错了吗?编辑回答:
您可以将接口和impl类放入一个单独的包中,如model
,然后根据需要从这个包中导入它们。Impl对象是服务器和客户端都使用的对象,它不会以这种方式(仅客户端方式)绑定它们。与JRMP一起使用的是UnicastRemoteObject,他们都必须知道这个对象
我将“import client.I_object;”放在客户机包中,因此
服务器将“链接”到客户端
“链接”一词在Java中毫无意义。如果您担心类泄漏,可以将远程接口及其所依赖的任何应用程序对象放入服务器和客户端通用的第三个包中。我解释得不好,我重新表述了我的问题:我应该在服务器包中重写接口“I_对象”吗,或者我需要从客户端包导入它?谢谢^^您可以将接口和impl类放入单独的包(如模型)中,然后根据需要从中导入它们。Impl对象是服务器和客户端都使用的对象,它不会以这种方式绑定它们。它是与RMI一起使用的UnicastRemoteObject,在这个意义上它不绑定它们,但必须使用它才能使用RMI调用。这种解释是不正确的。如果主机中运行注册表,则可以使用任何IP地址,通过Naming.bind()将内容绑定到该注册表。这与服务器套接字绑定地址无关,我想这正是您真正谈论的。这些都是通过java.rmi.server.hostname属性控制的。我已经回答了评论中真正的问题。问题是将接口和UnicastRemoteObject放在何处以便使用,在这种情况下,服务器和客户端都使用它,他们必须知道这个对象,是的,它正在侦听所有接口
tcp 0:::1000:::*侦听
。如果需要的话,我可以重新表述答案。你的评论也一样糟糕。客户端未使用Impl对象。“它不会以这种方式约束他们”和“它不会以这种方式约束他们”都是毫无意义的。远程对象不必扩展UnicastRemoteObject。我建议你重新开始。