gpt4 book ai didi

Java RMI :Updating client side objects in the server

转载 作者:行者123 更新时间:2023-11-30 04:05:59 25 4
gpt4 key购买 nike

我正在尝试使用 Java RMI 在分布式系统中实现用于组通信的中间件。

在那里,我需要将一个对象发送到服务器并修改它。因此更改应该反射(reflect)在客户端。

比如我会给出Oracle网站上最常见的教程:

X.java

public class X  implements Serializable, Remote{
public int x; // defined as public, just be simple.
}

Hello.java

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {

String sayHello(X c) throws RemoteException;
}

服务器.java

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {

public Server() {
}

public String sayHello(X c) {
c.x = 10;
return "Hello, world!";
}

public static void main(String args[]) {

try {
Server obj = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
LocateRegistry.createRegistry(1099);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);

System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}

客户端.java

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

public class Client {

public int x = 4;

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");
X x = new X();
String response = stub.sayHello(x);
System.out.println("response: " + x.x);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}

我的问题是,即使我在服务器端更新对象 c 中 x 的值,它也不会反射(reflect)到客户端。我可以简单地使用 return 来获取更新后的值,但我计划使用此方法为服务器实现多播功能。

谁能解释一下为什么吗?如果我需要这样做,该怎么做?

最佳答案

当您使用 RMI 时,您将有 2 个(或更多)Java 虚拟机参与给定计算,因此当您在客户端创建对象并调用服务器上的方法时,将此对象作为参数传递给状态对象的序列化并通过网络发送。在服务器端,创建同一类的新对象并在其上设置状态,但它是具有相同值的不同对象。对此克隆进行的操作不会反射(reflect)仍驻留在源虚拟机上的原始对象。

您可以在运行虚拟机的每台计算机上使用 rmiregistry 并注册每个对象以公开它(这是分布式解决方案),或者您可以将所有数据对象集中在具有 rmiregistry 的计算机上(这是集中式解决方案)解决方案,因为所有对象都在同一台机器上)。

干杯!

关于Java RMI :Updating client side objects in the server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20703944/

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