一个简单的RMI入门例程(转贴)

原创 2007年09月22日 17:26:00
 

HTML Tags and JavaScript tutorial



一个简单的RMI入门例程(转贴)





前提,J2SDK安装, 本例使用的是1.4.2_07。
RMI主要用在分布式应用中,一般情况下的使用是这样子,即业务逻辑在Server端的类中实现,而使用者即客户端则主要的调用Server提供的方法来得到结果。
下面就写一下这个例子,主要实现的功能是打印个1+2=3的等式。
哦,这儿要先想一下,即,对Client来讲,它需要知道Server提供了哪些东西,这个由一个接口来进行约束,即Server提供并实现了该接口里面的方法,而Client则参照该接口进行调用,就是这样一个思路。
那么Client是如何得到这些方法的实现呢,这就要归功于RMI,在Server那边同时提供一个RMI端口监听程序,来接受Client的呼叫调用。RMI同时建立一个基本框架。
这样一个思路应该比较明显,即建立一个Server程序放在RMI的框架中用于监听, 然后建立一个接口来约束基本方法的实现,Server对该接口进行了实现,Client则通过呼叫Server程序来调用该实现。
好了,如上所示,先建立一个接口,因为这个其实才是应用的业务核心所在:
RMIInterface.java:
import java.rmi.*;
public interface RMIInterface extends Remote{
 // 实现一个加法
 public int sum(int a, int b) throws RemoteException;
}
然后对该接口实现:
RMIInterfaceImpl.java:
import java.rmi.*;
import java.rmi.server.*;
public class RMIInterfaceImpl extends UnicastRemoteObject implements RmiSample{
 public RMIInterfaceImpl () throws RemoteException{ super(); }
 // 在这儿对该方法进行了实现
 public int sum(int a, int b) throws RemoteException{
  return a + b;
  }
}
这样实现了以后,在Client那边才能得到想要的结果,下面建立RMIServer程序,如下:
RMIServer.java:
import java.rmi.*;
import java.rmi.registry.*;
public class RMIServer{
 public static void main(String[] args) {
  try{
   LocateRegistry.createRegistry(8808); // 注册端口
   RMIInterfaceImpl server = new RMIInterfaceImpl();
   // Binding
   Naming.rebind("//localhost:8808/RMI", server); // 将实现类绑到一个名字上去
   }catch(java.net.MalformedURLException me){
   System.out.println("Malformed URL:" + me.toString());
   }catch(RemoteException e){
   System.out.println("Remote Exception:" + e.toString());
   }
  }
}
这样Server端的相差程序已经建立OK啦,下面就建立Client那边的程序,其实就是一个调用,到某个地址那里去找RMI的监听,然后取得对象,来调用得到结果:
RMIClient.java:
import java.rmi.*;
import java.rmi.server.*;
public class RMIClient {
 public static void main(String[] args){
  try {
   String url = "//190.0.0.112:8808/SAMPLE-SERVER";
   RMIInterface RMIObject = (RMIInterface)Naming.lookup(url); // 寻得对象
   System.out.println(" 1 + 2 = " + RMIObject.sum(1,2) );
   } catch (RemoteException exc) {
   System.out.println("Lookup error: " + exc.toString());
   } catch (java.net.MalformedURLException ex) {
   System.out.println("Malformed URL: " + ex.toString());
   } catch (java.rmi.NotBoundException e) {
   System.out.println("Not Bound: " + e.toString());
   }
  }
}
这里可能会有一个问题,就是对于这一句不免会有一点想法:
 RMIInterface RMIObject = (RMIInterface)Naming.lookup(url); // 寻得对象
嘿嘿,这个嘛,偶目前也有点不清楚,怎么用接口来取得对象。
好了,程序已经编完啦,只有四个类,下面编译,在本例中,四个类都放在缺省包下,编写一个用于编译的批处理文件,和这四个JAVA文件放在一起,至于这个并不重要,只是因为懒一点,所以写了,省得每次打那么多字:
Compile.bat:
javac *.java
rmic -d . RMIInterfaceImpl
编译完成后会出现六个类,这是怎么回事儿吶,原来多了两个类:
 RMIInterfaceImpl_Skel.class
 RMIInterfaceImpl_Stub.class
就是RMI的框架需要的类啦,不过在这里,Client只需要stub类就行了,别问我为什么,不知道,哈哈。
好了,下面就是分成两组,这儿可能.NET的兄弟又在说J2EE就是麻烦,呵呵,这是最无聊且没营养的一种说法,技术本身没有绝对的优劣,只有适合不适合于应用。
这六个类文件,其中Client端需要三个:
 RMIInterface.class
 RMIClient.class
 RMIInterfaceImpl_Stub.class
服务端则需要五个文件:
 RMIInterface.class
 RMIInterfaceImpl.class
 RMIServer.class
 RMIInterfaceImpl_Skel.class
 RMIInterfaceImpl_Stub.class
这儿可能再建立两个文件夹来分别copy一下,分成server和client应该比较容易理解和发布吧,呵呵,这个动作完全可以随手写个程序来完成的,由于偶没什么大的应用,所以就懒得写啦。
该动作的程序思路应该是这样子,即生成接口,在编译接口的时候,C和S各一份,然后做实现和Server程序,扔S那里去,而做Client调用程序的时候则扔C那里去,在用RMIC对实现建立框架的时候,则C和S也各一份,如此,就形成服务端和客户端分开的情况了。
当然Server的监听程序和Client的调用程序自动生成的东西比较多,嘿嘿
好了,对每个目录进行打包:
 /server
 Jar cvf server.jar *.class
 /client
 Jar cvf server.jar *.class
这儿其实可以不用打包,直接来用,不这不利于发布,也就写一下吧。
在生成server.jar和client.jar后,就可以进行“分布式”应用啦,哈哈,分布式其实挺简单的,就是在不同的机器单元上协同起来做同一件事情嘛。
分别为Server和Client写一个批处理,该例中,批处理和相应的jar文件是放在一起的:
 Server.bat:
 java -classpath "server.jar" RMIServer
 Client.bat:
 java -classpath "client.jar" RMIClient
OK,先运行server.bat,然后运行N次client.bat,不过每次的结果都是一样的,呵呵
 


java远程调用rmi入门实例

RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol...
  • h348592532
  • h348592532
  • 2014年10月17日 13:24
  • 2055

浅谈RMI - 搭建一个简单的RMI程序

RMI是Remote Method Invoke的缩写,是JDK提供的一个完善的、简单易用的远程调用框架,它要求客户端和服务器端都是Java程序。下面简述RMI的基本原理:如下图所示,RMI采用代理来...
  • xiaoyaoyulinger
  • xiaoyaoyulinger
  • 2016年05月19日 11:50
  • 2215

RMI简单实例与Spring集成RMI

rmi远程方法调用,用于服务器端和kehuduan
  • undergrowth
  • undergrowth
  • 2014年05月03日 13:18
  • 2267

转贴:一个简单的C#多线程间同步的例子

在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间...
  • qicai841125
  • qicai841125
  • 2011年01月10日 20:00
  • 126

一个简单的hadoop开发例程

一个简单的hadoop开发例程 Hadoop 是Google MapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的...
  • foreverdengwei
  • foreverdengwei
  • 2012年03月05日 23:33
  • 887

一个简单的socket通信例程

/*******tcp_server_p.c**********/ #include #include #include #include #include #include ...
  • chongcheng1887
  • chongcheng1887
  • 2016年12月03日 17:32
  • 80

网上发现的一个stm32的I2C比较通俗易懂的入门例程。

买了个核心板,算是有自己的STM32板子了,所以顺便也整一整I2C(因为上面的是24C02,嘻嘻,比较亲切),刚开始的时候,按照参考书上面的例程写了一个读写程序,但是直接把程序下载到板子里串口无数据输...
  • ludaoyi88
  • ludaoyi88
  • 2016年03月11日 21:44
  • 6497

JasperReport入门二 简单例程

一、简单例程 JasperReports 是现在用的比较广泛的一个报表引擎,它的模版是一个以".jrxml"为后缀的XML文件。一个典型的jrxml文件包含的元素有:  -根元素。 -标题...
  • j_sam_2009
  • j_sam_2009
  • 2012年08月01日 19:33
  • 678

一个简单的驱动程序例程

  • 2013年12月27日 15:15
  • 2.16MB
  • 下载

一个简单的窗体震动的例程.zip

  • 2009年02月27日 15:31
  • 153KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的RMI入门例程(转贴)
举报原因:
原因补充:

(最多只允许输入30个字)