[设计模式]代理模式 如何运行书上的RMI这个例子?

源码出处

《HeadFirst 设计模式》
oreilly商店: http://shop.oreilly.com/product/9780596007126.do
源码下载:https://resources.oreilly.com/examples/9780596007126

如何运行书上的RMI这个例子?

1、javac

 E:\TestRMI 的目录

2019/11/06  21:25              .
2019/11/06  21:25              ..
2019/11/06  21:12               120 MyRemote.java
2019/11/06  21:24               377 MyRemoteClient.java
2019/11/06  21:18               448 MyRemoteImpl.java
               3 个文件            945 字节
               2 个目录 78,462,738,432 可用字节

E:\TestRMI>javac MyRemoteClient.java

E:\TestRMI>javac MyRemoteImpl.java

E:\TestRMI>javac MyRemote.java

E:\TestRMI>dir
 驱动器 E 中的卷是 Disk
 卷的序列号是 4E45-FF6B

 E:\TestRMI 的目录

2019/11/06  21:26              .
2019/11/06  21:26              ..
2019/11/06  21:26               215 MyRemote.class
2019/11/06  21:12               120 MyRemote.java
2019/11/06  21:26               947 MyRemoteClient.class
2019/11/06  21:24               377 MyRemoteClient.java
2019/11/06  21:26               694 MyRemoteImpl.class
2019/11/06  21:18               448 MyRemoteImpl.java
               6 个文件          2,801 字节
               2 个目录 78,462,734,336 可用字节

2、开三个命令行窗口

  • 按照步骤1、2、3、4依次输入命令
    $ rmic MyRemoteImpl 生成MyRemoteImpl_Stub.class
    $ rmiregistry (光标开始闪烁,表示程序运行中,不要关闭命令行窗口)
    $ java MyRemoteImpl (光标开始闪烁,表示程序运行中,不要关闭命令行窗口)
    $ java MyRemoteClient
[设计模式]代理模式 如何运行书上的RMI这个例子?_第1张图片
RMI.png
  • 注意:如果把2、3的命令行窗口关闭,直接运行$ java MyRemoteClient会报错
[设计模式]代理模式 如何运行书上的RMI这个例子?_第2张图片
报错

完整源码

MyRemote.java

import java.rmi.*;

public interface MyRemote extends Remote {
    public String sayHello() throws RemoteException;
}

MyRemoteImpl.java

import java.rmi.*;
import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
    public String sayHello () {
        return "Server says, 'Hey'";
    }
    
    public MyRemoteImpl() throws RemoteException { }
    
    public static void main(String[] args) {
        try {
            MyRemote server = new MyRemoteImpl();
            Naming.rebind("RemoteHello", server);
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

MyRemoteClient.java

import java.rmi.*;

public class MyRemoteClient {
    public static void main(String[] args) {
        new MyRemoteClient().go();
    }
    
    public void go() {
        try {
            MyRemote service = (MyRemote)Naming.lookup("rmi://127.0.0.1/RemoteHello");
            String s = service.sayHello();
            System.out.println("Got: " + s);
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

参考资料

HeadFirst设计模式之RMI介绍
https://www.cnblogs.com/shamgod/p/5265480.html

你可能感兴趣的:([设计模式]代理模式 如何运行书上的RMI这个例子?)