当前位置: 首页 > 知识库问答 >
问题:

JavaRMI—从服务器上的远程方法向客户端返回对服务器上另一个远程对象的引用

戚弘和
2023-03-14

问题是使用RMI的客户机-服务器通信-我不知道如何返回在服务器空间上运行的对象(或对对象的引用)之类的东西,返回给客户机,然后我可以从该客户机调用该客户机的方法。我需要这个,因为基本的RMI示例仅仅是将字符串或int等数据从服务器传递到客户端,而不是在服务器上运行的完全序列化的对象。

我发现的唯一类似问题是,在RMI中是否可以通过引用传递?

我想做的是:

服务器:创建并导出远程对象(实现远程接口)。客户端调用此远程对象的方法。此方法依次创建另一个类的新对象并返回对该对象的引用。

客户端:从JavaRMI注册表中获取存根。根据远程对象规范调用存根,并获取另一个对象的句柄,然后使用该句柄调用在服务器空间中运行的该对象的方法。

这可能吗?我可能也遗漏了一两个概念。

代码:

//Hello.java
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface Hello extends Remote {
    public target sayHello() throws RemoteException;
}






//Server.java   
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {
public target t;
public Server() {}

public target sayHello() {
    target t = new target(1,"target");
    return t;
}

public static void main(String args[]) {
Hello stub = null;
Registry registry = null;

try {
    Server obj = new Server();
    stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
    registry = LocateRegistry.getRegistry();
    registry.bind("Hello", stub);

    System.err.println("Server ready");
} catch (Exception e) {
    try{
    registry.unbind("Hello");
    registry.bind("Hello",stub);
        System.err.println("Server ready");
    }catch(Exception ee){
    System.err.println("Server exception: " + ee.toString());
        ee.printStackTrace();
    }
}
}
}




//Client.java
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

private Client() {}

public static void main(String[] args) {


String host = (args.length < 1) ? null : args[0];
try {

    Registry registry = LocateRegistry.getRegistry(host);
    Hello stub = (Hello) registry.lookup("Hello");
    target response = stub.sayHello(); //**Error string cannot be converted to type** target while compiling with javac
    System.out.println("response: " + response.getdesc());
} catch (Exception e) {
    System.err.println("Client exception: " + e.toString());
    e.printStackTrace();
}
}
}




//target.java
import java.io.*;

class target implements Serializable {
int data;
String desc;

target(int data, String desc) {
this.data = data;
this.desc = desc;
}

public int getdata() { return data; }
public String getdesc() { return desc; }

public void setdata(int data) { this.data = data; }
public void setdesc(String desc) { this.desc = desc; }
}

共有2个答案

屠兴旺
2023-03-14

对不起,我不明白你的全部问题,但RMI有两种选择。

如果您对特定的类方法感兴趣,可以使用接口对在服务器的方法“sayHello”上创建的对象进行代理

像这样的东西:

public interface TargetInterface extends Remote {
    public void doSomething() throws RemoteException;
}

public Target extends UnicastRemoteObject implements TargetInterface {
    private static final long serialVersionUID = 7204253532056038242L; 
    public Target() throws RemoteException {
       super();
    }

    @Override
    public void doSomething() throws RemoteException {
        //TODO
    }
}

在方法中,应该返回TargetInterface。

否则,如果要了解所有对象结构,则对象应可序列化:

  public class Target implements Serializable

你在找这样的东西吗?

景育
2023-03-14

您只需要确保返回的对象是一个导出的远程对象,并且它在远程接口中被引用,该远程接口通过其自己的远程接口名称而不是其自己的名称返回该对象。

 类似资料:
  • 尝试远程启动服务时遇到奇怪的行为。 编辑:我进一步研究了这个问题,发现只有在尝试运行我的特定服务时才会出现这种情况。这意味着我的服务必须从已经登录的用户的会话中运行(这就是为什么如果我之前使用mstsc访问服务器,它仍然可以工作)。所以我想我的新问题是--有没有一种方法可以让我从PowerShell登录到远程机器? 多谢了。

  • 问题内容: 给定远程服务器“生产”(当前可通过IP访问)和本地数据库“开发”,如何使用T-SQL从“生产”运行到“开发”? 我使用的是MS SQL 2005,这两个数据库之间的表结构有很大不同,因此需要我手动编写一些迁移脚本。 更新: T-SQL确实不是我的包。我尝试了以下操作(不知道自己在做什么): 我得到了错误: 用户“”登录失败。该用户未与受信任的SQL Server连接关联。 问题答案:

  • 我有一个Maven Spring 4应用程序,我在 http://localhost:9292 的本地 Jetty 服务器上运行。我还有一个在 http://localhost:9990 运行的 JBoss EAP 服务器,我在其上创建了一个 JMS 主题。 但是我不知道如何从我的Spring应用程序中访问JMS元素。 在这篇文章的末尾是JBoss EAP 7配置文件中的一些元素独立.xml(消息

  • 本文向大家介绍mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法,包括了mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法的使用技巧和注意事项,需要的朋友参考一下 本文将介绍如何使用公司运行服务器进行开发调试,以及使用远程服务器python解释器,整理了对应的配置流程。 进入配置页面 Pycharm菜单栏,如下图所示,依次点击

  • 我在localhost上有一个带有mongo数据库的Spring Boot应用程序,一切都很好。 当我运行我的应用程序时,我得到“com.mongodb.mongoSocketOpenException:Exception opening Socket”由“regused by:java.net.SocketTimeoutException:connect timed out”引起

  • 我已经使用java RMI有一段时间了,但我不知道RMI远程存根(在服务器端)是否是单例的?我问的原因是: 让我们假设调用链中较低的RMI实现方法之一具有同步方法。如果由于某种原因,同步方法中的逻辑混乱(或挂起),则未来的RMI调用(来自客户端)在尝试访问该同步方法时也将挂起。只有当RMI存根是单态的时,这才成立。如果每次从客户端远程调用时都在服务器端创建一个新对象,这将不会是一个问题,因为这些方