Remote接口: 用于标识可以一个类或接口,被标识的类或接口的方法可以被非本地JVM调用。即运行在服务器JVM中被Remote标识类或接口的方法,可以被运行在客户端JVM中类调用。
1 创建被Remote标识的类,即被客户端远程调用的类
package com.demo.rmi;
import java.io.Serializable;
import java.rmi.Remote;
// 实现序列化接口是因为:被调用对象在网络上返回了对象,网络传输对象需要先序列化对象
public class IRemoteImpl implements Remote,Serializable {
public String show() throws RuntimeException {
System.out.println("进入");
System.out.println(this.toString());
return "远程调用成功";
}
}
2 在客户端创建被远程调用对象的“注册中心”
package com.demo.rmi;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;
public class ServerTest{
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException, InterruptedException {
IRemoteImpl r = new IRemoteImpl();
Registry registry = LocateRegistry.createRegistry(1234);
registry.bind("rmi",r);
System.out.println(r.toString());
// 这行代码是为了:让注册中心启动后,不会马上停止
new Scanner(System.in).nextLine();
}
}
3 创建客户端类调用远程对象
package com.demo.rmi;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class ClientTest{
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
IRemoteImpl iRemote = (IRemoteImpl) Naming.lookup("rmi://127.0.0.1:1234/rmi");
String string = iRemote.show();
System.out.println(string);
}
}
4 测试
先运行注册中心,在运行客户端。
注册中心运行结果:
客户端运行结果:
远程调用成功。
5 总结
- 在服务器中,创建被Remote标识的类或接口,用于被远程调用。
- 在客户端中,创建注册中心。
- 在客户端中,创建调用类,调用远程对象。