利用RMi进行分布式开发

利用RMi进行分布式开发

 bromon原创 版权所有

  RMI是J2EE中一项非常重要的技术,全称是远程方法调用(Remote Method Invokation),是EJB(Enterprise JavaBean)的基础。利用它可以很轻松的编写基于纯java(pure java)的分布式应用程序,使得表现层、逻辑层和数据层互相分离,便于程序的维护和数据的管理。下面使用RMI编写一个简单的分布式程序,介绍一下RMI的使用方法。为了使程序更具有参考价值,我们不局限于实现一个“hello,world”的简单例子。我们将在Rmi中传递一个较为复杂的对象,具体来讲就是服务器经用户请求后连接MSsql数据库,读取数据生成一个窗口,在客户端显示。程序涉及java中的RMI、swing组件、jdbc-odbc bridge连接数据库等技术,所以读者最好具备一些java的基础知识。


 一、开发环境


 首先需要一个jdk,版本越高越好,建议使用j2sdk1.4.1,可以在java.sun.com下载;服务器端需要安装mssql,版本在7.0及以上为佳。客户端需要有jre(java运行环境,java run environment)支持,不过大多数操作系统都内置了(windows xp除外,需要安装插件,可以在java.sun.com下载),不过使用新的jre可以避免很多莫名其妙的问题。虽然NotePad足以让我们完成所有代码的编写,但是一个好的编辑工具可以让你更加高效,推荐使用EditPlus 2。
 由于jdk的安装不是本问重点,所以只简单讲述一下jdk在windows下的安装。下载j2sdk1.4.1后运行,一路next即可,默认安装在c:j2sdk1.4.1。为windows设置环境变量,在path中加入;c:j2sdk1.4.1in,然后新建一个变量set classpath=c:j2sdk1.4.1lib ools.jar。如果你的安装目录是自定义的,做相应修改即可。注销一次使环境变量生效,打开一个控制台窗口(win98下打开msdos窗口),输入java,可以看到java的参数列表,表示安装没有问题。
 在mssql中建立数据库及表格。假设数据库名称为db1,表格名称为table1,并建立一个String字段name,任意添加一条记录。为该数据库创建数据源,假设数据源名为data。
 准备工作到此为止,Let’s go!
 二、一个完整的Rmi程序包括三个部分:主接口、服务器端和客户端。我们一边写一边讲解。
 首先是定义一个接口:
 //myInterface.java
 import java.rmi.*;             //所有的rmi程序都必须引入rmi包
 import javax.swing.*;          //创建可视化环境需要引入的包

 public class myInterface extends Remote
 {
  JFrame getData() throws RemoteException;
 }
 这个接口定义了远端可供调用的方法getData(),它返回一个JFrame,也就是一个swing窗口。这个方法必须抛出RemoteException异常。将文件保存为myInterface.java。到控制台下编译该文件:javac myInterface.java,会生成一个myInterface.class的文件。
 然后编写服务器端:
 //server.java
 import java.rmi.*;
 import javax.swing.*;
 import java.sql.*;             //连接数据库需要使用的包
 import java.rmi.server.UnicastRemoteObject;   //引入一个服务器端激活程序的包

 public class Server extends UnicastRemoteObject implements myInterface
 {
  static JFrame S_window=null;
  static JTextArea JTA=null;
  public Server() throws RemoteException{}
  public static void connect()
  {
   try
   {
    String  url="jdbc:odbc:data";
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection  conn=DriverManager.getConnection(url,"sa","");
    Statement  stmt=conn.createStatement();
    ResultSet  rs=stmt.executeQuery("select * from table1”);
    if(rs.next())
    {
     JTA.append(rs.getString(1).trim());
    }else
    {
     JTA.append(“数据库中没有数据”);
    }
    stmt.close();
    conn.close();
   }catch(Exception se)
   {
    System.out.println(“数据库连接出现错误”);
   }
 }
  public JFrame getData() throws RemoteException
  {
   S_window=new JFrame(“test”);
   JTA=new JTextArea(“”,10,5);
   Connect();
   JPanel JP=new JPanel();
   JP.add(JTA);
   S_window.getContentPane().add(JP);
   return(S_window);
  }
 public static void main(String args[])
  {
   try{
    S_window s=new S_window();
    Naming.rebind(“rmi:///myInterface”,s);
   }catch(Exception e)
   {
    e.getStackTrace();
   }
  }
 }
 服务器端首先抛出RemoteException异常,然后实现我们刚才则主接口中定义的方法getData()。使用Naming.rebind()方法注册RMI服务器,并与我们定义的s对象绑定,这样一来当我们在客户端向rmi://localhost/myInterface发出请求的时候,服务器端会自动调用s对象来处理请求。文件保存为server.java,编译它:javac server.java,生成server.class。
 最后我们来写客户端,非常简单:
 //client.java
 packge client
 import java.rmi.*;
 import javax.swing.*;

 public class client
 {
  static JFrame C_window=null;
  public static void main(String args[])
  {
   try{
    myInterface mi=(myInterface)Naming.lookup(“rmi://localhost/myInterface”);
    C_window=mi.getData();
   }catch(Exception e)
   {
    e.getStackTrace();
   }finally{
    C_window.setBounds(0,0,400,300);
    C_window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    C_window.show();
   }
  }
 }


 程序首先在本地定义一个swing窗口C_window,这个本地对象将接收远端对象的数据,在本地显示给用户,从而使得服务器端可以响应多个连接,如果不建立这个本地对象,而直接使用mi.getData().show()来显示窗口的话,程序一样可以运行,但是此时服务器端只会响应最后一个连接连接。Naming.lookup()是用来查找指定地址的Rmi服务的,通过调用它的getData()方法来运行服务器端的程序。

文件保存为clieng.java,编译它:javac client.java


 程序就编写完毕,下面让我们来部署它。到控制台下切换到程序所在目录,运行rmic server,会生成两个文件:server_stub.class和server_skel.class。请大家注意,server_stub.class是RMI服务在本地机器上的副本,叫做残根,客户端是通过它来和服务器建立连接,所以需要把它和client下面的所有.class文件一起安装到客户机。而server_skel.class是负责在服务器端等候连接,叫做框架,它将代表服务器与server_stub.class进行连接,将它和server下面的所有.class文件一起安装到服务器端。jdk1.2以上版本内置了框架,不需要自行生成,但是我们需要兼容低版本的jdk。部署完毕,现在注册rmi服务:控制台下运行start rmiregistry,不要关闭弹出的窗口;运行start java server启动服务器端,不要关闭弹出的窗口,然后运行java client启动客户端,如果顺利将生成一个swing窗口,含有一个文本区,里面将显示从数据库中读取的内容。


 利用Rmi开发分布式程序有很多好处,可以实现程序的多层结构,程序比较安全,即使客户端程序被反编译也不会造成泄密。RMI对服务器要求不高,只要能运行java即可,不像EJB那样需要另外安装容器。程序灵活,可以根据自己的需要在服务器端提供任何需要的服务而不用考虑权限问题。易于管理和维护,只需在服务器端做出修改就可以更改客户端的界面和功能。扩展性很强,利用服务器端进行i/o操作可以实现简单的web服务,利用服务器端与其他机器通过网络进行socket连接可以实现简单的代理服务器,等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值