JavaEE5学习笔记02之RMI

1.       RMI简单例子

首先咱们来看一个服务端代码

接口定义如下

package rmi.service;

 

import java.rmi.Remote;

import java.rmi.RemoteException;

 

import rmi.dto.UserDTO;

 

/**

 * 服务接口

 * @author liuyan

 */

public interface MyServer extends Remote {

 

    public String helloWorld(String name) throws RemoteException;

   

    public UserDTO getUserDTO() throws RemoteException;

}

 

接口要继承Remote,定义了2个服务方法,并且因为是远程调用,都需要抛出RemoteException的异常。

实现类如下

package rmi.service.impl;

 

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;

import java.rmi.server.UnicastRemoteObject;

 

import rmi.dto.UserDTO;

import rmi.service.MyServer;

 

public class MyServerImpl extends UnicastRemoteObject implements MyServer {

 

    /**

     *

     */

    private static final long serialVersionUID = 1L;

 

    protected MyServerImpl() throws RemoteException {

       super();

    }

 

    @Override

    public UserDTO getUserDTO() throws RemoteException {

 

       UserDTO userDTO = new UserDTO();

       userDTO.setId("1");

       userDTO.setName("素还真");

 

       return userDTO;

    }

 

    @Override

    public String helloWorld(String name) throws RemoteException {

       return "hello world----" + name;

    }

 

    public static void main(String[] args) throws Exception {

       MyServer myServer = new MyServerImpl();

       LocateRegistry.createRegistry(19898);

       Naming.rebind("rmi://:19898/liuyanrmi", myServer);

 

    }

 

}

实现类继承自UnicastRemoteObject,并且因为是远程调用,所以构造函数也得是要抛出RemoteException的。

因为服务的其中一个方法需要返回一个对象,我们列出这个实体的代码

package rmi.dto;

 

import java.io.Serializable;

 

/**

 * dto

 *

 * @author liuyan

 *

 */

public class UserDTO implements Serializable {

 

    /**

     *

     */

    private static final long serialVersionUID = -5181326376273015609L;

 

    public UserDTO(){

 

    }

 

    private String id;

    private String name;

 

    public String getId() {

       return id;

    }

 

    public void setId(String id) {

       this.id = id;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    @Override

    public String toString() {

       return "UserDTO [id=" + id + ", name=" + name + "]";

    }

   

}

因为此实体需要在网络中进行传输,所以必须实现序列化接口。

由此服务端代码完毕,下面我们来看客户端测试代码

客户端代码如下

package rmi.client;

 

import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.NotBoundException;

import java.rmi.RemoteException;

 

import rmi.service.MyServer;

 

public class RMIClient {

 

    /**

     * @param args

     * @throws NotBoundException

     * @throws RemoteException

     * @throws MalformedURLException

     */

    public static void main(String[] args) throws MalformedURLException,

           RemoteException, NotBoundException {

       MyServer myServer = (MyServer) Naming.lookup("rmi://:19898/liuyanrmi");

      

       System.out.println("client:"+myServer.helloWorld("client"));

        System.out.println("client:"+myServer.getUserDTO().toString());

    }

 

}

客户端就简单的多了,直接和服务器端的接口耦合就可以了,其他的不用管,只需要通过Naming找到JNDI服务命名rmi://:19898/liuyanrmi。(不写IP地址默认就是本地)

客户端输出的结果就是

client:hello world----client

client:UserDTO [id=1, name=素还真]

怎么样,很像Web Service吧。如果Web Service的服务端和客户端都是Java的,那当然可以用RMI了。

远程SessionBean就是通过RMI让客户端调用的时候好像是在本地执行似地。

原理如下:
JavaEE5学习笔记02之RMI
 

实际上是通过动态代理类在客户端执行后仿佛给使用者一个错觉像是调用了远程的代码。

你可能感兴趣的:(java,.net,Web)