1、先创建一个工程

image.png
image.png
image.png

2、创建新模块

image.png
image.png
image.png
image.png
image.png

3、再创建一个客户端

image.png
image.png
image.png
image.png

4、先在服务端创建一个接口

先创建接口,创建实现类。

IHelloService接口

  1. public interface IHelloService extends Remote {
  2. // 1、定义一个sayHello方法
  3. public String sayHello(User user) throws RemoteException;
  4. }

IHelloServiceImpl实现类

  1. public class IHelloServiceImpl extends UnicastRemoteObject implements IHelloService {
  2. // 手动实现父类的构造方法
  3. protected IHelloServiceImpl() throws RemoteException {
  4. super();
  5. }
  6. // 我们自定义的sayHello,将来要进行网络传输,这个User是要经过远程调用的
  7. // user需要序列化,则User类中需要实现序列化接口
  8. @Override
  9. public String sayHello(User user) throws RemoteException {
  10. System.out.println("this is server, say hello to "+user.getUsername());
  11. return "success";
  12. }
  13. }

user类

  1. public class User implements Serializable {
  2. private String username;
  3. private int age;
  4. public User() {
  5. }
  6. public User(String username, int age) {
  7. this.username = username;
  8. this.age = age;
  9. }
  10. public String getUsername() {
  11. return username;
  12. }
  13. public void setUsername(String username) {
  14. this.username = username;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. }

RMIServer启动类

  1. public class RMIServer {
  2. public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
  3. // 1、创建HelloService 实例
  4. IHelloService service = new IHelloServiceImpl();
  5. // 2、获取注册表
  6. LocateRegistry.createRegistry(8888);
  7. // 3、对象的绑定
  8. // bind 方法的参数1: rmi://ip地址:端口/服务名 参数2: 绑定的对象
  9. Naming.bind("//127.0.0.1:8888/myrmiserver",service);
  10. }
  11. }

5、在客户端创建一个启动类

RMIClient客户端

  1. public class RMIClient {
  2. // 通过这个主方法去调用远程服务
  3. public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
  4. //1、从注册表中获取远程对象,强转
  5. // 因为在服务端绑定的时候根据127.0.0.1....这个协议绑定的,所以现在也得通过协议取出
  6. // 查询到的肯定是接口对象,所以这里可以强转为接口
  7. // lookup这个对象其实是一个代理对象
  8. IHelloService lookup = (IHelloService) Naming.lookup("//127.0.0.1:8888/myrmiserver");
  9. //2、准备参数
  10. User user = new User("haha", 18);
  11. //3、调用远程方法sayHello
  12. String message = lookup.sayHello(user);
  13. System.out.println(message);
  14. }
  15. }

6、启动两个启动类

客户端、服务端完成了远程调用。
image.png
image.png