RMI使用学习 小结
1. RMI简介
RMI(远程方法调用)是Java编程语言中用于实现远程过程调用的应用程序编程接口。RMI使一个Java虚拟机上的对象能够调用在另一个Java虚拟机上的对象的方法。RMI实现了对象级别的远程过程调用,用户不必关心底层的网络通讯细节。
RMI使用Java远程调用(Java Remote Method Invocation)技术,Java RMI机制使两台计算机的Java虚拟机能够协同工作,其中一台Java虚拟机可以调用另一台Java虚拟机中的方法。
2. RMI使用步骤
RMI对于Java程序员来说相对比较复杂,需要考虑到的因素较多,使用步骤如下:
2.1 实现远程接口
必须有一个java接口,声明了客户端可以远程调用的方法。
public interface HelloWorld extends java.rmi.Remote {
public String sayHello() throws java.rmi.RemoteException;
}
2.2 实现远程接口的实现类
必须有一个实现了远程接口的实现类。
public class HelloWorldImpl extends java.rmi.server.UnicastRemoteObject implements HelloWorld {
public HelloWorldImpl() throws java.rmi.RemoteException {
super();
}
public String sayHello() throws java.rmi.RemoteException {
return "Hello World!";
}
}
2.3 创建和安装远程对象
可以通过Java RMI提供的rmiregistry工具(位于JDK的bin文件夹下),让客户端通过远程对象来访问实现类的对象。
HelloWorld obj = new HelloWorldImpl();
try {
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("HelloWorld", obj);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
2.4 启动RMI注册表
需要在服务端启动RMI注册表,使用rmiregistry命令即可。
rmiregistry &
2.5 运行客户端
客户端必须知道实现远程接口的名称或地址。
try {
// 指定ip和端口号,连接远程对象
Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
HelloWorld obj = (HelloWorld) registry.lookup("HelloWorld");// 获取远程对象调用接口方法
String message = obj.sayHello();
System.out.println("Message: " + message);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
3. RMI使用示例
3.1 实现一个简单的计算器
远程接口
public interface Calculator extends java.rmi.Remote {
public int add(int x, int y) throws java.rmi.RemoteException;
public int minus(int x, int y) throws java.rmi.RemoteException;
}
远程接口实现类
public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator {
public CalculatorImpl() throws java.rmi.RemoteException {
super();
}
public int add(int x, int y) throws java.rmi.RemoteException {
return x + y;
}
public int minus(int x, int y) throws java.rmi.RemoteException {
return x - y;
}
}
启动服务端和客户端
需要在服务端启动RMI注册表,并将远程对象绑定到注册表;客户端连接注册表,获取远程对象,并调用远程接口中定义的方法。
服务端:
Calculator obj = new CalculatorImpl();
try {
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("Calculator", obj);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
客户端:
try {
Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
Calculator obj = (Calculator) registry.lookup("Calculator");
// add
int result1 = obj.add(5, 10);
System.out.println("5 + 10 = " + result1);
// minus
int result2 = obj.minus(10, 5);
System.out.println("10 - 5 = " + result2);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
3.2 实现一个简单的通信程序
远程接口
public interface Chat extends java.rmi.Remote {
void send(String name, String s) throws java.rmi.RemoteException;
String get() throws java.rmi.RemoteException;
}
远程接口实现类
public class ChatImpl extends java.rmi.server.UnicastRemoteObject implements Chat {
String message;
public ChatImpl() throws java.rmi.RemoteException {
super();
message = "";
}
public void send(String name, String s) throws java.rmi.RemoteException {
message = name + ": " + s;
System.out.println(message);
}
public String get() throws java.rmi.RemoteException {
return message;
}
}
启动服务端和客户端
需要在服务端启动RMI注册表,并将远程对象绑定到注册表;客户端连接注册表,获取远程对象,并调用远程接口中定义的方法。
服务端:
Chat obj = new ChatImpl();
try {
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("Chat", obj);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
客户端:
Chat obj = (Chat) Naming.lookup("rmi://localhost/Chat");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String name;
String message;
System.out.println("Please type in your name:");
name = br.readLine();
while (true) {
System.out.print("Message: ");
message = br.readLine();
obj.send(name, message);
}
4. 结论
- RMI是JAVA中远程方法调用的重要的API和实现工具。
- 实现RMI需要考虑到的因素较多,实现过程中需要实现远程接口和远程接口实现类,同时运行服务端和客户端。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:RMI使用学习 小结 - Python技术站