http://dev.csdn.net/article/49/article/49/49078.shtm

解决方案 »

  1.   

    http://www.flashman.com.cn/UploadFiles/2004-10-12/20041012171027246.rar
    给你个我试过的例子前段时间做过一个学生资料管理系统,用的就是RMI,感觉挺好用的.而且还很稳定.唯一不爽的地方就是如果修改了远程方法哪个一个字符,客户端和服务端都需要从新编译才可连接.
      

  2.   

    你认为是等同于B/S结构是不正确的。
    B/S结构中,从服务器端S是无法主动向客户端C进行“推”操作的,
    但是rmi可以,客户端lookup到一个服务器端的远程对象后,可以
    向服务器端注册一个存在于客户端上的远程对象,从而使得服务器
    端能够主动向客户端“推”信息,最典型的就是从服务器端诸个更新
    客户端界面的的某些状态,注意,这是服务器端发起的。
    我猜想JMS大概就是根据这个原理来做的。
      

  3.   

    rmi 的好处:1.户机实现对主机上方法的调用,不用考虑如何实现连接通信。2.跨平台,且方法灵活。3.容易实现。4.可为多用户提供不同的服务,编程简单,思路清晰。
    实际应用:1、实现一个接口,包含你要实现的方法。2、实现接口方法的类。3、实现服务端程序,端口号绑定一个服务名。4、实现客户端的方法引用,通过服务名寻找到服务,调用已实现的接口方法,完成相应功能。例如:
    //接口,Hello.java 
    import java.rmi.Remote;
    import java.rmi.*;
    public interface Hello extends java.rmi.Remote { 
    //rmi应用程序必须继承自java.rmi.Remote
    public String sayHello() throws java.rmi.RemoteException ; 
    //定义可以远程调用的接口
    }
    //实现接口的方法,HelloImpl.java
    import java.rmi.*;
    import java.rmi.server.UnicastRemoteObject;
        public class HelloImpl extends UnicastRemoteObject implements Hello  //实现Hello接口
        {
           private String name;
           public HelloImpl (String s ) throws java.rmi.RemoteException
          {
           super(); //调用父类的构造函数
           name = s;
          }
        public String sayHello() throws RemoteException 
        try{
            return "Hello world!"; //实现Hello接口定义的方法
           }catch (Exception e)
             {
             System.out.println("HelloImpl.main: an exception occured:");
             e.printStackTrace(); //产生异常的话,打印出出错信息
             }
    }
    //实现服务,HelloServer.java
    import java.io.*;
    import java.rmi.*;
    public class HelloServer
    {
    public static void main (String args [])
     {
      System.setSecurityManager ( new RMISecurityManager());    //设置RMI程序需要的安全策略
      try
       {
         Hello obj = new HelloImpl("HelloServer");           //生成一个HelloImpl的实例
         Naming.rebind("//127.0.0.1:8801/HelloServer", obj);     //将这个实例绑定到一个名字上
         System.out.println("HelloImpl created and bound in 
                                                the registry to the name HelloServer");
       }catch(Exception e) {
         System.out.println("FileServer: "+e.getMessage());
         e.printStackTrace();
       }
      }
    }
    //实现客户端调用远端方法,HelloClient.java
    import java.rmi.*;
    public class HelloClient
    {
      public static void main(String args[])
      {
        System.setSecurityManager(new RMISecurityManager() );   //设置RMI需要的安全策略
        try
         {
           Hello obj = (Hello) Naming.lookup("//127.0.0.1:8801/HelloServer");  
                                                              //从服务端获得一个Hello的远程对象
           String message = obj.sayHello();                   //远程调用Hello的方法
           System.out.println(message);                       //将输出结果打印
         } catch (Exception e)
            {
               System.out.println("Hello client : an exception occured");
               e.printStackTrace(); //若有异常,输出异常信息
            }
     }
    }接下来,编写一个文本文件,内容为:
    grant {permission java.security.AllPermission "", "";
    };并命名为rmi.policy,为了运行方便,把它与刚刚编写的程序防于同一个文件夹。
    运行步骤如下:
    1、javac *.java
    2、rmic HelloImpl
    3、rmiregistry 8801   注意,保留此窗口
    4、新开一cmd窗口,在文件目录下运行
    java -Djava.security.policy=rmi.policy HelloServer  注意,保留此窗口
    5、java HelloClient
    显示“Hello World!”。