有人可以提供Hello World的简单RMI回调示例吗?我一直在努力研究它,但我似乎无法找到一个我理解的。我不明白回调是什么/做什么。
这是我目前的Hello World RMI,如果它有帮助......
接口
package example.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
客户端
package example.hello;
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");
String response = stub.sayHello();
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
服务器
package example.hello;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Server implements Hello {
public Server(){}
@Override
public String sayHello() {
System.out.println("responded!");
return "Hello, world!";
}
public static void main(String[] args) {
try{
Server obj = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
// 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();
}
}
}
答案 0 :(得分:15)
我不是RMI的专家,但我可以告诉你,你可以从“David and Michael Reilley”中搜索“Java网络编程和分布式计算”这本书。您将能够找到从第278页开始的RMI CALLBACK实现的一个很好的示例!
作者定义了理解它的一种好方法,所以我觉得复制/粘贴比尝试制作我自己的更好,这就是:
在默认实现中,RMI只允许CLIENT与SERVER之间的通信,请求服务器主机中的远程服务(远程对象)的操作。您可以使用回调方法,而不是让您的服务器与您的客户端通话!
Thast很棒!想象一下,如果你有一台服务器,你想要检查它是否在线(或者如果没有掉线/关机)给客户带来了!你必须要求连续使用一个远程对象,它应该返回一些布尔值(例如)告诉你实际上是在线的。
那太可怕了!因为你会丢失一些网络带宽,再次在服务器上再次请求,并再次......在其上引起一些连接池!
在这些情况下,使用CALLBACK确实应该是有用的; - )
我希望你能理解我的答案,了解回调是什么/做什么。
致以最诚挚的问候,