Java 使用RMI访问对象

Java 使用RMI访问对象,java,refactoring,rmi,Java,Refactoring,Rmi,我们最近开始使用RMI,我很难理解它 在上一个示例中,(我将在下面介绍)我们使用工厂来存储对象,并在从工厂调用的实例的服务器类中使用Naming.rebind() 在上面的示例中,我只有实现和服务器类,没有使用工厂,我如何重新考虑代码以便远程访问对象,我会再次使用Naming.rebind(),还是有其他实现 这是我以前用过的: Class FoodItem{ private String name; private int numCalories; public FoodItem

我们最近开始使用RMI,我很难理解它

在上一个示例中,(我将在下面介绍)我们使用工厂来存储对象,并在从工厂调用的实例的服务器类中使用
Naming.rebind()

在上面的示例中,我只有实现和服务器类,没有使用工厂,我如何重新考虑代码以便远程访问对象,我会再次使用
Naming.rebind()
,还是有其他实现

这是我以前用过的:

Class FoodItem{ 
 private String name; 
 private int numCalories; 

 public FoodItem(String s, int cals) 
 { 
 name = s; 
 numCalories = cals 
 } 
 public String getName() 
 { 
 return name; 
 } 
 public int getNumOfCalories() 
 { 
 return numCalories; 
 } 
}

public class FoodItemServer 
{ 
 public static void main(String [] args) 
 { 
 FoodItem f1 = new FoodItem("Wispa", 254); 
 FoodItem f2 = new FoodItem("Apple", 45); 
 System.out.println( "Food Name: " + f1.getName + “has “ +
 f1.getCalories +“calories”); 
 } 
} 

为了使用RMI,您需要一个实现java.RMI.Remote接口的接口 您的FoodItemServer必须从java.rmi.server.UnicastRemoteObject扩展并实现此接口

此外,您需要在RMI注册表中注册此类,该注册表 必须另外启动。这是一个提供JNDI的特殊服务器 接口


客户端可以通过java.naming机制请求RMI注册表来接收RMI远程接口类型的实例,

好的,我明白你的意思,这与我们以前的做法类似,我现在在eclipse中处理它,我应该没事了,谢谢Christian,我会尽快接受你的回答,如果可能的话,我会看看EJB技术或者使用WebService(SOAP/Rest)。RMI仍然是可能的,但在大多数情况下,如果可能,最好使用这些更复杂的技术。RMI注册表提供了一个RMI接口。JNDI提供了一个RMI接口。注册表不提供JNDI接口。扩展UnicastRemoteObject或将该对象绑定到注册表不是必需的:在每种情况下都有备选方案。@EJP不理解您的评论。我不同意rmi没有提供JNDI接口,因为rmi有它自己的命名机制,比如JNDI,但是调用概念是相同的,但是其余的对我来说是完全混淆的。请告诉我备选方案。您可以调用UnicastRemoteObject.exportObject(),而不是扩展UnicastRemoteObject。一旦从注册表中获得一个远程存根,就可以从RMI调用中获取其他存根作为返回值。您可以想象一整棵RMI对象树扎根于注册表中的一棵。
import java.rmi.Naming;

/*
 * Creates the server for using RMI
 */
public class PlayerServer 
{
    public static void main(String args[])
    {
          System.out.println("Player Server Starting");
            try{
                PlayerFactory aFactory = PlayerFactory.getInstance();
                Naming.rebind("factory", aFactory);
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }