如何在不同的主机上用 RMI 做命名系统?
How to do naming system with RMI in different hosts?
我有两个 java 类 一个是客户端,另一个是服务器,在客户端我必须给服务器 ip 地址,但我想让它动态所以客户端知道搜索方法(如 DNS)的第三台机器(命名系统)的 ip 和 returns 提供此方法的特定服务器的 ip 地址。
已编辑:
类客户:
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);
Registry registry = LocateRegistry.getRegistry("192.168.1.9",1091);
Calculator stub = (Calculator) registry.lookup("Hello");
String response = stub.add(4,2);
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
服务器:
public class Server implements Calculator{
public Server() {}
public String add(int a,int b) {
return "Hello, a+b= "+(a+b);
}
public String sub(int a,int b) {
return "Hello, a-b= "+(a-b);
}
public static void main(String args[]) {
try {
Server obj = new Server();
Calculator stub = (Calculator) UnicastRemoteObject.exportObject(obj, 0);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.createRegistry(1091);
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
您不能使用 RMI 注册表执行此操作。只有与注册表位于同一主机中的进程 运行 才能绑定到它。您将不得不使用不同的命名服务,例如 LDAP。
然而,您描述的其余部分是 RMI 已经完成的。您在注册表中查找一个名称,它 returns 您是一个知道如何与相应的远程对象通信的存根。
我有两个 java 类 一个是客户端,另一个是服务器,在客户端我必须给服务器 ip 地址,但我想让它动态所以客户端知道搜索方法(如 DNS)的第三台机器(命名系统)的 ip 和 returns 提供此方法的特定服务器的 ip 地址。
已编辑:
类客户:
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);
Registry registry = LocateRegistry.getRegistry("192.168.1.9",1091);
Calculator stub = (Calculator) registry.lookup("Hello");
String response = stub.add(4,2);
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
服务器:
public class Server implements Calculator{
public Server() {}
public String add(int a,int b) {
return "Hello, a+b= "+(a+b);
}
public String sub(int a,int b) {
return "Hello, a-b= "+(a-b);
}
public static void main(String args[]) {
try {
Server obj = new Server();
Calculator stub = (Calculator) UnicastRemoteObject.exportObject(obj, 0);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.createRegistry(1091);
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
您不能使用 RMI 注册表执行此操作。只有与注册表位于同一主机中的进程 运行 才能绑定到它。您将不得不使用不同的命名服务,例如 LDAP。
然而,您描述的其余部分是 RMI 已经完成的。您在注册表中查找一个名称,它 returns 您是一个知道如何与相应的远程对象通信的存根。