远程服务调用RMI框架: 是纯java写的, 只支持java服务之间的远程调用,很简单,

  // 接口要继承 Remote接口
public interface IHelloService extends Remote { public String sayHello(String msg)throws RemoteException;
} //实现类 要继承 UnicastRemoteObject 类, 并重写 构造方法
public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {
protected HelloServiceImpl() throws RemoteException {
super();
} @Override
public String sayHello(String msg) throws RemoteException{
return "hello "+msg;
}
} ## 发布服务
public class RMI_Server {
public static void main(String[] args) throws Exception {
//这是将 本服务发布出去
IHelloService helloService = new HelloServiceImpl();
//这是将 locateRegistry 相当于注册中心, 发布出去
LocateRegistry.createRegistry(1099);
//这是将 rul 和 服务,存到 HashTable中, 并发布出去
Naming.bind("rmi://127.0.0.1/hello",helloService); System.out.println("服务发布成功");
}
} ## 服务调用client
public class RMI_Client {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
IHelloService helloService = (IHelloService) Naming.lookup("rmi://127.0.0.1/hello");
System.out.println(helloService.sayHello("啦啦啦啦啊"));
}
}

运行结果:

源码解读: 这里参考别人博客,自己不重复造轮子:

https://blog.csdn.net/qq_20597727/article/details/80861906

自己理解:

HelloServiceImpl ---> 构造-->exportObject(obj, new UnicastServerRef(port));--->1:这里先对当前对象代理生成代理对象, 将代理对象包装成Target对象,发布出去--->TCPEndPoint发布服务(可以将这里看做传输层) ---> this.listen(); 监听( 这里面可看到 工厂模式 new 了一个 serverSocket, 并创建一个线程 (这个线程循环 socket阻塞, 当监听到client过来的时候, 线程池调用线程,发送,当前服务对象, 最后关闭 serverSocket) )

LocateRegistry.createRegistry(1099); ------>this.setup(new UnicastServerRef(var2, RegistryImpl::registryFilter));----->var1.exportObject(this, (Object)null, true);----> 接下来和 发布服务是一样的... 这个操作是将LocateRegistry 发布出去, LocateRegistry相当于注册中心,是单独的一个进程,在 java/bin下

Naming.bind("rmi://127.0.0.1/hello",helloService); -----> 这个是将url 和对应服务 绑定起来,---> 先获取这侧表, 然后注册表将 url 和 对应服务绑定 内部其实是一个Hashtable , url---key, 服务--->value , 获取一个新连接, 将 url和服务 发送出去

Client 端, IHelloService helloService = (IHelloService) Naming.lookup("rmi://127.0.0.1/hello"); --->先获取到注册表, 然后监听 对应的 rul, 先从HashTable中根据url 获取服务,有就直接返回

最新文章

  1. 虚拟目录webconfig的配置
  2. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承
  3. mysql主从同步问题解决汇总
  4. 扫描二维码下载安装apk的app
  5. Centos7下用命令下载jdk7及jboss-eap-6
  6. POJ 1741 树上的点分治
  7. jquery plugins —— datatables ajax post更新数据
  8. mysql repair data 语句
  9. 【HTTP】Fiddler(一) - Fiddler简介和使用
  10. 防止横竖屏时,iphone自动缩放的一段js代码
  11. JavaCodeTra 猴子选猴王 约瑟夫循环
  12. Hadoop学习历程(三、第一个程序)
  13. html和css实现一级菜单和二级菜单学习笔记
  14. J2SE知识点摘记(二十)
  15. [Openfire]使用WebSocket建立Openfire的客户端
  16. 宝藏(树形DP)
  17. WPF 自定义滚动条(ScrollView、ScrollBar)样式
  18. 【翻译】Ext JS最新技巧——2015-10-21
  19. Spring NoSuchBeanDefinitionException六大原因总结
  20. Python中浅拷贝和深拷贝的区别总结与理解

热门文章

  1. Jenkins反序列化漏洞复现
  2. drbd虚拟机宕机恢复方法
  3. src/main/resorces applicationContext.xml
  4. 从零开始搞监控系统(1)——SDK
  5. Python中的迭代器、生成器、装饰器
  6. Asp.NetCore Web应用程序中的请求管道和中间件
  7. C++ primer plus读书笔记——第15章 友元、异常和其他
  8. oo第四单元作业总结
  9. Envoy:经过envoy代理后获取客户端真实IP
  10. [OS] 概述&学习资料