9.10 RMI学习 为EJb的学习做好准备

 

java应用程序.ear  包括:1、web应用程序*.war 和2、ejb应用程序*.jar

 

分布式开发:1,网络通信 2 分布式事务的集群

 ejb没出现之前,用cobar组建。。需要400-500行代码
 而用ejb解决分布式开发,紧紧只需几分钟,代码量非常少

 

ejb用专门的fwq,tomcat是不可以的。

 

而ejb最底层的核心机制为rmi机制!
借助rmi机制实现简单的远程调用开发

 

远程调用:指运行在两个不同的jvm进程java程序之间的通信,可以在一台机器上实现,当然进程是不同的,也是两个java虚拟机

---------------------------------------------------------------------------------------------------------------------------------------

 两个角色:1、server端程序:a 将远程对象进行公布  server端对象,将对象和名字绑定~!(类似注册)
                                           b 接受这样一个客户端的调用                                    


                2,browers程序                                 
                                           和java虚拟机建立连接
                                           通过jndi机制以命名方式去查找远程对象,获得这样一个远程对象的引用

 

 

rmi原理,它的模型图


client----------------X--------------  server(远程对象,定义:实现了Remote接口的对象)
   |                                                 |
   |                                                 |
stub(本机代理)---- 网络-------------  skelton(远程代理)

stub是服务于客户端的:

                      1、stub在远程调用之前和server的java虚拟机(JVM)建立连接
                      2、客户端调用方法时,stub将调用参数进行编组(序列化),stub调用skelton对象的方法
                      3、skelton将值返回(字节流),stub将字节还原最终结果给客户端!
skelton是服务于服务器断的:
                      1、接受stub调用,将调用的参数进行序列化,然后调用其真实对象(远程对象)
                      2、远程对象执行业务逻辑后,将值返回给skelton对象,skelton对象将值进行序列化传递给stub对象~!

 

rmi编程:

 

rmi编程规范
1,编写远程接口(声明被远程调用的方法,继承Remote接口,方法的声明,必须声明RemoteException   
2, 提供远程对象,实现远程接口的方法,还必须继承UnicastRemoteObject
    JVM可以自动导出stub和skelton对象
3,编写服务器程序,创建远程对象,将远程对象和名字绑定在一起,公布远程对象!
4,客户端程序:查找这样一个远程对象,获得远程对象的引用,调用远程方法!
 

先写一个接口:
HelloRemote extends Remote
写一个sayHellow方法,这个方法有可能出错,throws RemoteException

 

再写一个HelloImpl实现类 继承UnicastRemoteObject implements HelloRemote 接口
public HelloImpl()throws RemoteException{
  super();
}//它父类UnicastRemoteObject 的构造方法抛不出异常,我们自己重新写一个新的可以抛异常的构造方法


最后在:
服务器端程序 HelloServer

public static void main(String[] args)throws Exception{
  HelloRemote remote=new HelloImpl();
  LocateRegistry.createRegistry(8818);//实现通信端口的占领
  Naming.rebind("//localhost:8818/helloObject",remote);//将对象跟命名绑定在一起
}

 

客户端程序:
HelloClient中
public static void main(String[] args){
  HelloRemote remoteObject=(HelloRemote)Naming.lookup("//localhost:8818/helloObject");//根据命名绑定得到服务器对象
  System.out.println(remoteObject.sayHello("zhongxin"));
}
}

 


---------------------------------------------------------------------------------------------------------------------------------------

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值