小弟初学java,写了RMI客户机和服务器交互的代码。
但不知道怎么部署运行。用的web服务器是jboss。
哪位高手能告诉一下具体的步骤。
我怎么样将server端部署到服务器,
怎样用client端去访问。
谢谢。

解决方案 »

  1.   

                public   String   addUpdateNetType()   throws   Exception{ 
                      InfoCodeNetType   icnt=new   InfoCodeNetType(); 
    icnt.setNetTypeCode(infoCodeNetTypeService.getSequenceNextVal                                         ( "INFO_CODE_NET_TYPE_SEQ ").toString()); 
    icnt.setNetTypeName(infoCodeNetType.getNetTypeName()); 
    icnt.setNetTypeNote(infoCodeNetType.getNetTypeNote()); 
    icnt.setNetTypeOrder(infoCodeNetType.getNetTypeOrder()); 
    icnt.setInfoCodeNetTypeProperty(infoCodeNetType.getInfoCodeNetTypeProperty()); 
    icnt.setInfoCodeNetTypeStatus(infoCodeNetType.getInfoCodeNetTypeStatus()); 
    this.infoCodeNetTypeService.update(icnt); 
    return   SUCCESS; 
      

  2.   

    以前 java.sun.com 上有样例代码的,不知道被收购上之后网站风格有没有变化。你提供部署到 jboss 上,我有点疑问,一般来说如果先体验一下 RMI 是如何工作的,按下面列的几点再结合书上的样例代码就可以了。如果你需要知道如何调用 Jboss 上的组件的话,有一点可以备用的:到 EJB 2.0 的时候,已经出现了与 CORBA 兼容的 RMI-IIOP 协议版本,而且 EJB 2.0 Local EJB 需要 CORBA 2.3 的 value type 的支持以达到执行上下文 (Security Context & Transaction Context) 的透明传播,也就是说,你也可以用 CORBA 来访问 EJB,而且用 CORBA 来访问 JBOSS 里面的 EJB 等组件是更好的方法,这是趋势所向,只要对比一下,Java EE 5.0 中 ORB 已经成为一个认证的 J2EE 应用服务器的标准服务就可以看出使用 RMI 已经不如使用 CORBA 更有生命力。当然了解几种常用的分布式应用本身可以类比更好地理解而不是非要在将来用上这些技术。顺便提一下,像 EJB 里面 PortableRemoteObject.narrow 在我们 lookup 得到的是一个远程对象时不应该省略,就像 RMI 协议升级的情况我们就不能假设未经 narrow 而直接 cast (转型) 到一个类型就一定行得通,不同的厂商可以决定如何实现,不同的版本也可能略有差异。对于一个普通的 RMI Training,基本上的思路就是(假设 JNDI 已经熟悉了):
    首先,分布式的应用需要一个 Naming/Registry 的东西,在服务端把自己绑定进去之后,让客户端能查找“服务”,RMI 里面是 rmiregistry.exe。其次,用一个启动类把服务端实现类绑定到 rmiregistry 中去,使用一个 JNDI 风格的名字服务,服务端阻塞等被客户端调用,以免客户端调用时服务端进程已经退出了(使用 Java Activation Framework 时的情况则不同,先了解 Unicast 的情况后 Activation 的情况就简单一些)。再次,客户端启动向 rmiregistr 这个注册表查询指定名字下的服务,然后调用它。注意,因为服务端和客户端是面向接口编程,具体的实现类在编码时可能出现:客户端准备调用前查找服务端时因缺少 Stub 而失败,我们需要把 Stub 放到客户端;如果客户端调用服务端功能的接口的形参也是接口,那么客户端可能给出的实现类在服务端没有,这时我们需要在服务端给出一个 RMI codebase URL,告诉 RMI 服务端"如果有类找不到的话,尝试去这个 URL 查找",这是一个 URLClassLoader 去加载,这里因为包括隐含地访问网络或文件,所以需要明确授权(用 Java 2 Security Policy 文件在命令行提供,并在程序启动时 System.setSecurityManager() 启用,安全的一般性原则是对于可能有风险的操作,只有使用者明确的确认才可以执行);
    (接口中的返回值也是接口类而具体实现类只有服务端提供的话时)客户端找不到服务端的返回值对应的类时也是类似处理。
      

  3.   

    不知道现在还要不要:
       给你几段简单的代码看看吧:
      服务端:
      首先在server端需要一个接口,继承自java.rmi.Remotepublic interface Hello extends Remote {
     
     public String say() throws RemoteException;
    }
    其次实现这个接口并继承java.rmi.server.UnicastRemoteObject
    public class SayHello extends UnicastRemoteObject implements Hello{ protected SayHello() throws RemoteException{
      super();
     }
     public String say() throws RemoteException {
      return "Hello";
     }
    }
    接着注册服务,绑定端口public class Reg {
     public static void main(String[] args) throws RemoteException,MalformedURLException{
      LocateRegistry.createRegistry(1099);
      SayHello sh = new SayHello();
      Naming.rebind("rmi://localhost:1099/sh", sh);
      System.out.println("注册完毕");
     }
    }
    然后在客户端
    public class Client {
     public static void main(String[] args) throws RemoteException,MalformedURLException,NotBoundException{
      Hello h = (Hello)Naming.lookup("rmi://localhost:1099/sh");
      System.out.println(h.say());
     }} 
    希望能帮到你,如果还有不明白的可以和我联系。