gpt4 book ai didi

Java RMI - 从服务器上的远程方法返回对服务器上另一个远程对象的引用到客户端

转载 作者:行者123 更新时间:2023-11-30 09:02:16 25 4
gpt4 key购买 nike

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

我发现的唯一类似问题是 is it possible to pass by reference in RMI?

我想做的是:

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

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

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

代码:

//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; }
}

最佳答案

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

关于Java RMI - 从服务器上的远程方法返回对服务器上另一个远程对象的引用到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26055695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com