达内LOGO和北京达内网址达内科技培训项目:Java培训 3G培训 Android培训 软件测试培训北京达内服务电话
java培训
Java远程调用与分布式通信的区别

      同进程查找JDNI服务
   
    比如说我们通过JNDI来查找Tomcat中配置的DataSource,代码如下
   
    Context context = new InitialContext();
   
    DataSource ds = (DataSource)context.lookup(“java:/comp/env/jdbc/oracleds”);
   
    将这两行代码放到JSP页面中,在new InitialContext()之后,就能在JNDI服务上查到DataSource
   
    这是因为JSP和JNDI服务是在同一个进程里的。但如果不是同一个进程,则不能new InitialContext()
   
    这就好像是两间屋子里面的资源无法共享一样,除非穿墙,否则是无法拿到对面屋子里的资源的
   
    所以在main()方法中是无法有效的执行这两行代码的
   
    因为在运行main()方法时,它会在一个进程中启动JVM来解析class,而Tomcat那里又是另外一个进程
   
    所以在这两个进程之间,只是通过简单的new InitialContext()是找不到JNDI服务的,事实上这个过程就是在远程调用
   
    其实所谓的远程,并不是说跨机器、跨网络就是远程,只要是两个进程之间的调用,就算是远程调用了
   
    也就是说只要是不在同一个JVM里面(更准确的来说是不在同一个地址空间内)的调用,它就是远程调用
   
    也就是说如果我们在同一个机器上,启动两个进程,然后进行互相调用,那么这个过程就已经是远程调用了
   
    分布式通信的基本原理
   
    主要是使用客户端上的Stub(存根)和远程对象上的Skeleton(骨架)作为中介,来实现分布式通信的
   
    在客户端会有一个叫做Stub(存根)的东西,其实现采用的是非常典型的代理模式,是远程对象在客户端的代理
   
    Stub会封装所交互的数据的访问细节(如何压缩、压包、编码等),然后通过相应的协议与Skeleton(骨架)交换数据
   
    对于Java领域的分布式通信技术,较常见的有EJB技术、CORBA技术、WebService技术等等
   
    如果是EJB技术,那么Stub就会采用RMI-IIOP协议来传送数据给Skeleton
   
    如果是CORBA技术,那么Stub就会采用IIOP协议来传送数据给Skeleton
   
    如果是WebServices技术,那么Stub就会通过SOAP(搜魄)协议来传送数据给Skeleton
   
    也就是说Stub会按照特定协议将信息传送给Skeletion
   
    而Skeleton会将Stub传送过来的数据解析成特定的语言对象并发送给远程对象,即服务端
   
    比如说服务端是采用Java开发的,那么Skeleton就会将接收到的数据解析成Java对象,再传送给服务端。
   
    同理若服务端是采用C#开发的,那么Skeleton就会将接收到的数据解析成C#对象,再传送给服务端。
   
    接着服务端就会返回信息给客户端,于是Skeleton就会将所要返回的信息进行压缩编码并通过相应的协议传送给Stub。
   
    接着Stub就会将Skeleton传送过来的信息解开,再传送给客户端,所以客户端就获得了相应的服务端的返回信息了
   
    这里的客户端对象和远程对象是位于不同的JVM中的,或者说是不同的系统平台中,此即分布式通信。
   
    它主要就是靠Stub和Skeleton来通讯,说白了,分布式通信也就是Stub和Skeleton之间的通信。